使用Mongoose将多个文档插入到集合中时,由于每个.save()
方法都有自己的回调,因此您如何知道它们何时完整,以便mongoose.disconnect()
可以?
假设我需要将3个文档插入数据库:
var database = mongoose.connect('mongodb://localhost/somedb');
document1.create({...}, function(err){
if (err) { ... }
// It's saved!
});
document2.create({...}, function(err){
if (err) { ... }
// It's saved!
});
document3.create({...}, function(err){
if (err) { ... }
// It's saved!
});
database.disconnect();
disconnect
最有可能在文档保存到数据库之前发生,特别是如果Mongodb服务器是远程或慢速的话。
处理此问题的最佳方法是什么?承诺是唯一的方式吗?几年前Promise如此普遍之前,解决这个问题的方法是什么?
答案 0 :(得分:0)
一个选项而不是使用promises是使用已存在多年的async
库。有很好的帮助器,例如async.series
和async.parallel
,当所有提供的方法都完成时提供最终的函数调用,不同之处在于是否需要操作以串行方式完成(一个接一个)只需并行执行所有操作:
async.parallel(
[
function(callback) {
document1.create({...},callback);
},
function(callback) {
document2.create({...},callback);
},
function(callback) {
document3.create({...},callback);
},
],
// Called when all completed or on an error
function(err,results) {
// err is any error
// results contains an array ( in this case ) of any results
mongoose.disconnect();
}
)
由于任何一种情况下的第一个参数都是数组或包含函数调用的对象,因此只要第二个参数是收到任何错误的处理程序,您就可以构建所述数组/对象并将其传入。或者当一切都完成时执行。
所以你可以举例说#34; build"像这样:
var list = [
{ "model": "Model1", "data": {...} },
{ "model": "Model2", "data": {...} },
{ "model": "Model3", "data": {...} }
];
list = list.map(function(item) {
return function(callback) {
mongoose.model(item.model).create(item.data,callback);
}
});
async.parallel(list,function(err,results) {
// err is any error
// results contains an array ( in this case ) of any results
mongoose.disconnect();
});
这一切都与硬编码一样,但是以简单的程序方式。
当然,另一种自然的方法是简单地将每个调用嵌套在它们的回调中,但是如图所示的库旨在使事物变得更漂亮,更容易操作以创建这样的列表。