我在找一个答案,发现this。像在jQuery中有when
函数。使用一些准则来同步异步调用我在节点 中使用async.js
以下是代码。如何从异步函数返回db调用的值
async.forEach(dateInDateFormat, function(item, callback) {
console.log(moment(item.startDate).toDate());
var result = Trip.aggregate([{
"$unwind": "$trips"
}, {
"$match": {
"trips.startTime": {
"$gte": moment(item.startDate).toDate(),
"$lte": moment(item.endDate).toDate()
}
}
}, {
"$group": {
"_id": {
"date": {
"$dayOfMonth": "$trips.startTime"
}
},
"distance": {
"$sum": "$trips.distance"
}
}
}]);
result.exec(function(err, doc) {
console.log(doc);
});
console.log("Executing callback");
callback();
}, function(error) {
console.log("Loop over");
});
这是输出。
Executing callback
Loop over
[ { _id: { date: 23 }, distance: 0 },
{ _id: { date: 22 }, distance: 0 },
{ _id: { date: 21 }, distance: 0 } ]
[ { _id: { date: 29 }, distance: 210 },
{ _id: { date: 27 }, distance: 210 },
{ _id: { date: 26 }, distance: 210 },
{ _id: { date: 25 }, distance: 0 } ]
[]
正如你所看到的。在获取数据之前执行回调和循环。我无法使用res.send()
将它发送回我的Angular Frontend。 一个答案是你无法从异步函数中返回一个值。你只返回一个回调。在这种情况下我该怎么做? 或 如何使用async.series([])
功能。因为我也使用过,甚至没有给我确切的结果。 谢谢
编辑 回答简而言之,回调函数的位置很重要。如果你在错误的地方给它,不要期待写回答。请参阅答案和评论主题中的代码以获得更好的解释。
好感谢您的解释,但它仍然是不明确的。如果你看到输出(我刚刚编辑输出),并看到console.logs()有问题。 console.log(“Loop over”)在打印数组之前执行。因此,在'function(error)'处发送'res.send'的想法将不起作用。你知道还有其他的工作吗? –
@SarasArya你试过我的答案吗?在你的例子中,我很确定,“循环结束”执行如此之快,因为你并没有等待'result.exec'的响应。 – dm03514
嘿它工作了......先看代码。我认为这是一样的。在你的第二个评论后。我通过diffChecker运行它,发现回调的位置发生了变化,这实际上是有道理的。起初很难理解答案,但代码的工作向我解释了如何。非常感谢。这将成为我异步编程历史上最重要的事情之一。 –