【发布时间】:2013-06-29 06:42:04
【问题描述】:
我正在探索使用 q 而不是 async - 然后我遇到了这里解决的问题:
Mongoose JS promises? Or how to manage batch save
如果我使用 q,这个答案会是什么?
【问题讨论】:
标签: javascript node.js asynchronous mongoose promise
我正在探索使用 q 而不是 async - 然后我遇到了这里解决的问题:
Mongoose JS promises? Or how to manage batch save
如果我使用 q,这个答案会是什么?
【问题讨论】:
标签: javascript node.js asynchronous mongoose promise
请参阅 @rquinn 的帖子,如果 docs[i].save() 未返回承诺,则此代码可能实际上不起作用。
var tasks = [];
for (var i=0; i < docs.length; i++) {
tasks.push(docs[i].save());
}
Q.all(tasks)
.then(functions, function(results) {
console.log(results);
}, function (err) {
console.log(err);
});
我们在循环中一次启动所有操作,但我们不等待其中任何一个完成,因此它们并行运行。我们向一个数组添加一个 Promise(其作用类似于结果的占位符)。然后我们等待 promise 数组中的所有 promise 完成。
【讨论】:
.save 正在返回一个承诺。如果不是,那么您的解决方案确实是正确的。
请参阅我的评论,了解我在使用 ForbesLindesay 的解决方案时遇到的问题。这是我最终得到的结果(只是添加了 ninvoke 来返回一个承诺):
var tasks = [];
for (var i=0; i < docs.length; i++) {
tasks.push(Q.ninvoke(docs[i], "save"));
}
Q.all(tasks)
.then(functions, function(results) {
console.log(results);
}, function (err) {
console.log(err);
});
【讨论】: