猫鼬批量保存承诺
Posted
技术标签:
【中文标题】猫鼬批量保存承诺【英文标题】:Mongoose batch save with promises 【发布时间】:2013-06-29 06:42:04 【问题描述】:我正在探索使用 q 而不是 async - 然后我遇到了这里解决的问题:
Mongoose JS promises? Or how to manage batch save
如果我使用 q,这个答案会是什么?
【问题讨论】:
【参考方案1】:请参阅 @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 不返回承诺,它是异步的,所以我认为 Q.all.then() 将在实际插入记录之前被调用。也许这对你来说不是问题。我在 Q.all.then() 中调用 process.exit,它没有插入记录。 啊,我以为.save
正在返回一个承诺。如果不是,那么您的解决方案确实是正确的。【参考方案2】:
请参阅我的评论,了解我在使用 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);
);
【讨论】:
以上是关于猫鼬批量保存承诺的主要内容,如果未能解决你的问题,请参考以下文章