我有一个for循环语句和一个异步MongoDB内部循环体。我想要做的是从我的MongoDB数据库中进行find
查询,并将结果推送到数组中。
以下是代码:
function() arrResult() {
var arr = [];
for(...) {
collection.find({ foo: i }, function (err, cursor) {
arr.push(cursor);
}
}
return arr;
}
但很明显,函数的返回值是一个空数组。
我想使用Q
模块解决此问题。有没有解决方案?
答案 0 :(得分:2)
我想使用Q模块解决这个问题。有没有解决方案?
是的,承诺是一个非常容易的抽象来处理这个问题。您可以并行执行查询,并使用all
收集结果。
特别是Q
,它看起来像这样:
function arrResult(…) {
var promises = [];
for (…)
promises.push( Q.ninvoke(collection, "find", {foo: i}) );
return Q.all(promises);
}
arrResult(…).then(function(arr) {
…
}, function(err) {
// first error, if any occured
});
答案 1 :(得分:1)
您需要一个像进程门一样的同步机制。 每个返回的查询必须到达门,例如减少一些计数器并存入其结果。 当所有人都到达大门时,最后的回调确实会返回收集的结果。