我正在使用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)
});
}
我该怎么做?
答案 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_cb
和some_other_cb
将同时运行。这是因为Control通过回调而不是您习惯的常规逐行方法。