我在循环体中有一个for-loop语句和一个异步MongoDB。我想做的是从我的MongoDB数据库进行find
查询,并将结果推送到数组中。
这是代码:
function() arrResult() {
var arr = [];
for(...) {
collection.find({ foo: i }, function (err, cursor) {
arr.push(cursor);
}
}
return arr;
}
但很明显,该函数的返回值将是一个空数组。
我想使用Q
模块来解决这个问题。有什么解决办法吗?
我想使用 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
});
您需要一个类似于进程门的同步机制。每个返回的查询都必须到达门口,例如递减一些计数器并存入其结果。当全部到达门口时,最终回调会返回收集到的结果。