我正在使用nodejs Mongo驱动程序,我想备份一些小集合并将一些数据插入到一个集合中。
我提出的流程是:
_bak
创建集合); backupProms.push(backupCollection(cb));
Promise.all(function(parameter)).then(function(){})
确定性地对齐promise管道,并在备份和清除集合后执行插入循环。然而,这不能按预期工作,我从未进入应在.then()
之后执行的Promise.all()
语句。
问题:这是处理这种情况的正确方法,我该怎么做才能达到应在.then()
之后执行的Promise.all()
语句。我认为可能有更优雅的方法或解决方案。提前谢谢。
var backupCollection = function(collection){
let backup_coll = collection + "_bak";
return new Promise((resolve, reject) => {
console.log("About to backup current " + collection + " collection");
db.createCollection(backup_coll, function(err){
if(err) throw err;
// some logic to backup the collections
});
});
});
}
for(i = 0, len = backupCollArr.length; i < len; i++){
var cb = backupCollArr[i];
backupProms.push(backupCollection(cb));
}
Promise.all(backupProms).then(function(){
return new Promise((resolve, reject) => {
for (var i = 1; i <= iterations; i++){
rand1 = polluter_prefix + Date() + Math.random();
guid1 = genGUID();
db.collection(insertColl).insert({
// code to add data
});
}
});
}).then(function(){
db.close(function(){
console.log("Close connection");
});
});
答案 0 :(得分:1)
你永远不会解决也不会拒绝你的承诺。 以下是工作解决方案的示例:
var backupCollection = function(collection){
let backup_coll = collection + "_bak";
return new Promise((resolve, reject) => {
console.log("About to backup current " + collection + " collection");
db.createCollection(backup_coll, function(err){
return err ? reject(err) : resolve();
});
});
}
for(i = 0, len = backupCollArr.length; i < len; i++){
var cb = backupCollArr[i];
backupProms.push(backupCollection(cb));
}
Promise.all(backupProms)
.then(function(){
return;
});
Promise.all
将解析数组中的所有promise,如果Promises永远不会被解析,它将等待,如果所有Promises成功,它将调用.then
,如果一个Promise失败,它将调用{ {1}}。
在你的情况下,它永远不会解决,因为你永远不会调用.catch
,还要注意在Promise链中,意思是resolve()
或.then
你不必返回一个承诺,您可以返回任何内容并继续.catch
,如果它抛出错误,它将被.then
捕获。但是如果你有一个异步调用,你必须返回一个Promise。这是一个例子:
.catch