我想使用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();
}
});
}
});
}
});
}
});
答案 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"。
.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'
});