【问题标题】:Mongoose batch save with promises猫鼬批量保存承诺
【发布时间】:2013-06-29 06:42:04
【问题描述】:

我正在探索使用 q 而不是 async - 然后我遇到了这里解决的问题:

Mongoose JS promises? Or how to manage batch save

如果我使用 q,这个答案会是什么?

【问题讨论】:

    标签: javascript node.js asynchronous mongoose promise


    【解决方案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);
    });
    

    【讨论】:

      猜你喜欢
      • 2018-08-19
      • 2015-04-01
      • 1970-01-01
      • 2021-12-04
      • 2015-05-12
      • 1970-01-01
      • 2012-12-14
      • 2017-06-15
      • 2019-06-04
      相关资源
      最近更新 更多