Node.js X次异步mongo查询未运行后的回调。
由于某种原因,从未触发对此的回调。有2条消息,正确地说,输出为:Node.js X次异步mongo查询未运行后的回调。,node.js,mongodb,async.js,Node.js,Mongodb,Async.js,由于某种原因,从未触发对此的回调。有2条消息,正确地说,输出为: 10 12 12 20 20 26 26 然后,当回调运行时,应该输出30,但回调从未运行过 代码: app.get("/getMessages", function (req, res) { var JSONtoSend = [];
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);
}
});
});
});
您缺少迭代器的回调函数。如果查看文档(),则在参数列表下,
的第二个参数(迭代器)将同时接收消息和回调。以下是摘录:
迭代器(项,回调)-应用于
数组。迭代器被传递一个必须调用的回调(err)
一旦完成。如果没有发生错误,则应执行回调
不带参数或使用显式空参数运行
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()
。如果查看文档(),则在参数列表下,的第二个参数(迭代器)将同时接收消息和回调。以下是摘录:
迭代器(项,回调)-应用于
数组。迭代器被传递一个必须调用的回调(err)
一旦完成。如果没有发生错误,则应执行回调
不带参数或使用显式空参数运行
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()
。如果查看文档(),则在参数列表下,的第二个参数(迭代器)将同时接收消息和回调。以下是摘录:
迭代器(项,回调)-应用于
数组。迭代器被传递一个必须调用的回调(err)
一旦完成。如果没有发生错误,则应执行回调
不带参数或使用显式空参数运行
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()
。如果查看文档(),则在参数列表下,的第二个参数(迭代器)将同时接收消息和回调。以下是摘录:
迭代器(项,回调)-应用于
数组。迭代器被传递一个必须调用的回调(err)
一旦完成。如果没有发生错误,则应执行回调
不带参数或使用显式空参数运行
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()
啊,我理解。我被有两个回调的事实弄糊涂了:每个项目一个回调,整个项目一个回调。谢谢啊,我明白了。我被有两个回调的事实弄糊涂了:每个项目一个回调,整个项目一个回调。谢谢啊,我明白了。我被有两个回调的事实弄糊涂了:每个项目一个回调,整个项目一个回调。谢谢啊,我明白了。我被有两个回调的事实弄糊涂了:每个项目一个回调,整个项目一个回调。谢谢