使用callback的值

我正在使用ExpressJS在Node.js中开发应用程序。 我是事件驱动开发的新手,我有一个关于事件驱动的体系结构和可见性的基本问题。

我有一个服务,需要做几个MySQL查询,并返回他们作为一个JSON对象。 像这样的东西:

exports.someService = function(..) { mysql.query("some select", function(rows...) { // here I want to store the rows in a way to be visible from parent function }); mysql.query("some other select where id=some value from previous select", function(rows...) { res.send(rows from this query + rows from previous query) }); } 

我怎样才能做到这一点?

如果要使用callback的结果,则必须将使用结果的代码放在callback中。

所以你的例子会变成:

 exports.someService = function(..) { mysql.query("some select", function(rows...) { mysql.query("some other select where id=some value from previous select", function(rows...) { res.send(rows from this query + rows from previous query) }); }); } 

你可以通过取消你的callback并将相关参数传给它们来清理它:

 exports.someService = function(..) { mysql.query("some select", cb1); } function cb1(sql_result_1) { mysql.query("some other select where id=some value from previous select", function(sql_result2) { cb2(sql_result_1, sql_result2) }); } function cb2(sql_result_1, sql_result2) { res.send(rows from this query + rows from previous query) } 

您必须将callback链接在一起,因为在基于事件的模型中,代码不会被阻止。

例如,

 mysql.query("...", some_cb); mysql.query("...", some_other_cb); 

在概念上, some_cbsome_other_cb将同时运行。 这是因为控制通过callback,而不是在你习惯的正常的逐行方法。