使用Mongoose保存多个文档并在保存最后一个文件时执行某些操作

时间:2015-07-10 20:05:03

标签: javascript mongodb mongoose jasmine

我想使用Mongoose将8个对象保存到MongoDB数据库。保存最后一个文档时,我想报告(即发送一个事件)所有文档都已保存。

我现在这样做的方式非常混乱(特别是对于我想要保存的越来越多的文件)。

这就是我现在拥有它的方式(本例仅适用于4人)。你能推荐一种更清洁的方式吗?

person1.save(function(err, result){
    if (err) console.log(err);
    else{
        person2.save(function(err, result){
            if (err) console.log(err);
            else{
                person3.save(function(err, result){
                    if (err) console.log(err);
                    else{
                        person4.save(function(err, result){
                            if (err) console.log(err);
                            else{
                                done();
                            }
                        });
                    }
                });
            }
        });
    }
});

5 个答案:

答案 0 :(得分:12)

协调异步操作的有用库是async。在您的情况下,代码看起来像这样:

var people = [ person1, person2, person3, person4, ... ];

async.eachSeries(people, function(person, asyncdone) {
  person.save(asyncdone);
}, function(err) {
  if (err) return console.log(err);
  done(); // or `done(err)` if you want the pass the error up
});

答案 1 :(得分:4)

使用promises和Array.map()

String.delete!("^\u{0000}-\u{007F}"); 

答案 2 :(得分:2)

我建议有一个数组并保存迭代。将具有相同的性能,但代码将更清洁。

你可以拥有

required=False

答案 3 :(得分:0)

我会使用Underscore Each来迭代一组People模型。这样可以使您的代码更清晰,并有助于避免您使用代码遇到的"boomerang effect"

来自documentation

  

.each(list,iteratee,[context])别名:forEach

     

迭代一系列元素,然后依次产生一个iteratee函数。如果传递了一个,则iteratee绑定到上下文对象。每次调用iteratee都会调用三个参数:(element,index,list)。如果list是JavaScript对象,则iteratee的参数将是(value,key,list)。返回链接列表。

例如:

var people = [person1, person2];
var length = people.length;
var hasError = false;

var doSomething =  function() {
    console.log('I'm done');
}

var doSomethingElse =  function() {
    console.log('There was an error');
}

_.each(people, function(person, i) {

    if (!hasError) {

        person.save(function(err, result) {
            if (err) {
                console.log(err);
                hasError = true;
            }
        );

        if (i === length) {
            doSomething();
        }

    } else {

        // There was an error
        doSomethingElse();
    }

});

答案 4 :(得分:0)

最好的方法是使用异步waterfall。 部分代码段可能如下所示。请参考以上链接。 它打破了异步性质并转换为一个接一个的过程(如果我没有错)。

 waterfall([
    function(callback){
 callback(null, 'one', 'two');
},
   function(arg1, arg2, callback){
    callback(null, 'three');
  },
  function(arg1, callback){
 // arg1 now equals 'three' 
  callback(null, 'done');
  }
], function (err, result) {
  // result now equals 'done' 
});