Mongoose JS承诺?或者如何管理批量保存

Jie*_*eng 7 synchronization mongoose mongodb

如何在Mongoose中管理批量保存?我看到它可能还不可能:

有人提到使用一些流量控制库q,但我也注意到mongoose中的承诺,可以使用吗?我可以在jQuery Deferred/Promises中做

$.when(obj1.save(), obj2.save(), obj3.save()).then ->
    # do something? 
Run Code Online (Sandbox Code Playgroud)

For*_*say 9

是的,你可以用承诺做到这一点.如果你使用Q promise库,你可以重写@matz3的代码,如:

var tasks = [];

for (var i=0; i < docs.length; i++) {
  tasks.push(docs[i].save());
}

Q.all(tasks)
  .then(function(results) {
    console.log(results);
  }, function (err) {
    console.log(err);
  });
Run Code Online (Sandbox Code Playgroud)

我们在循环中一次启动所有操作,但我们不等待它们中的任何一个完成,因此它们并行运行.我们向数组添加一个promise(对结果来说就像占位符一样).然后,我们等待承诺数组中的所有承诺完成.

大多数优秀的Promises/A +兼容库都有一些等价的Q.all

  • 我不认为save()会返回一个promise. (3认同)
  • 不,我正在开始数组中的操作,所以我需要包含`()`.然后返回我放入数组的`promise`对象.它是平行的,因为我只得到一个承诺,而不是实际的最终结果.最后,我等待那些承诺解决. (2认同)

Sco*_*and 5

猫鼬现在允许您选择哪个Promise实现。

在这里,我使用的是Node.js中默认的Promise(ES6)系统

var mongoose = require('mongoose');
    mongoose.Promise = global.Promise; // use system implementation

Promise.all(obj1.save(), obj2.save(), obj3.save())
.then(function(resultSaves) {

    console.log('parallel promise save result :');
    console.log(resultSaves);
    mongoose.disconnect();

}).catch(function(err) {

    console.log('ERROR on promise save :');
    console.log(err);
    mongoose.disconnect();
});
Run Code Online (Sandbox Code Playgroud)

节点-版本v4.1.1

猫鼬@ 4.1.8


Zil*_*nas 5

由于mongoose现在支持您可以使用的承诺Promise.all().then(),因此当所有承诺都得到解决时它将返回。

Promise.all([
  obj1.save(),
  obj2.save(),
  obj3.save()
])
.then(console.log)
.catch(console.error)
Run Code Online (Sandbox Code Playgroud)

事实上,如果您总是调用该save()方法,则可以在Array.map()此处使用:

Promise.all([ obj1, obj2, obj3 ].map( obj => obj.save() )
Run Code Online (Sandbox Code Playgroud)

Aaand 还使用 es6 语法来解构结果数组:

Promise.all([ obj1, obj2, obj3 ].map( obj => obj.save() )
.then( ([ savedObj1, savedObj2, savedObj3 ]) => {
   // do something with your saved objects...
})
Run Code Online (Sandbox Code Playgroud)


小智 3

尝试一下async模块的并行功能。

var functions = [];

for (var i=0; i < docs.length; i++) {
    functions.push((function(doc) {
        return function(callback) {
            doc.save(callback);
        };
    })(docs[i]));
}

async.parallel(functions, function(err, results) {
    console.log(err);
    console.log(results);
});
Run Code Online (Sandbox Code Playgroud)