由于某种原因,永远不会触发此回调。有2条消息,正确地说,输出是:
10
12
12
20
20
26
26
然后在回调运行时输出然后30
,但它永远不会输出。
码:
app.get("/getMessages", function (req, res) {
var JSONtoSend = [];
getAllMessages(req.session.cur_user, function ( messages ) {
console.log("10");
async.each(messages, function (message) {
console.log("12");
User.findById(message.senderId, function (sender) {
console.log("20");
User.findById(message.recieverId, function (reciever) {
console.log("26");
JSONtoSend.push({ content:message.content, reciever: reciever, sender: sender });
});
});
}, function (err) { // this is the callback
if (err) {
console.log(err);
} else {
console.log("30");
res.json(JSONtoSend);
}
});
});
});
答案 0 :(得分:3)
你错过了迭代器的回调函数。如果检查文档(link here),则在参数列表下,each
的第二个参数(迭代器)同时接收消息和回调。这是摘录:
所有迭代器函数完成后,iterator(item,callback) - 一个应用于每个项目的函数 阵列。迭代器传递一个必须被调用的回调(err) 一旦完成。如果没有发生错误,则应该回调 不带参数或使用显式null参数运行。
async只会运行你的最终回调 - 并且调用迭代器的回调是async如何跟踪完成的数量。
尝试以下方法:
app.get("/getMessages", function (req, res) {
var JSONtoSend = [];
getAllMessages(req.session.cur_user, function ( messages ) {
console.log("10");
async.each(messages, function (message, callback) {
console.log("12");
User.findById(message.senderId, function (sender) {
console.log("20");
User.findById(message.recieverId, function (reciever) {
console.log("26");
JSONtoSend.push({ content:message.content, reciever: reciever, sender: sender });
callback();
});
});
}, function (err) { // this is the callback
if (err) {
console.log(err);
} else {
console.log("30");
res.json(JSONtoSend);
}
});
});
});
理想情况下,您还会将任何可能的错误传递给callback()