Nodejs:.then()语句在Promise.all()之后不执行

时间:2017-09-20 11:45:48

标签: javascript node.js mongodb

我正在使用nodejs Mongo驱动程序,我想备份一些小集合并将一些数据插入到一个集合中。

我提出的流程是:

  • 定义一个可以备份集合的函数(通过使用postfix _bak创建集合);
  • 对于我要备份的每个集合,我调用该函数并将调用添加到promise返回函数数组中。 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");
        });
    });

1 个答案:

答案 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