使用回调值

时间:2013-06-01 15:49:20

标签: node.js design-patterns event-driven-design

我正在使用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)
  });  
}

我该怎么做?

1 个答案:

答案 0 :(得分:2)

如果你想使用回调的结果,你必须在回调本身中放置使用结果的代码。

所以你的例子会变成:

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)
     });  
   });
}

您可以通过取消嵌套回调并传递相关参数来清理它:

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)
}

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

如,

mysql.query("...", some_cb);
mysql.query("...", some_other_cb);
从概念上讲,

some_cbsome_other_cb将同时运行。这是因为Control通过回调而不是您习惯的常规逐行方法。