2

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

我怎样才能做到这一点?

4

1 回答 1

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_cb并且some_other_cb在概念上将同时运行。这是因为 Control 通过回调而不是您习惯的常规逐行方法传递。

于 2013-06-01T16:05:57.993 回答