for循环中的嵌套promise不符合预期

时间:2016-04-08 05:32:47

标签: javascript node.js mongodb promise

我无法在Promise内扩展.then()。我试图在for循环中执行数据库更新,然后在处理完所有记录后关闭数据库。但是,应用程序立即退出process.exit(),这意味着即使在所有数据库更新完成之前,process.exit()也已执行。我很确定我对嵌套的承诺做错了。

var myDB;

function doSomething() {
   return MongoClient.connect(DB_CONNECTION).then(function(db) {
        myDB = db;
        var collection = db.collection(COLLETION_NAME);
        for (var i = 0; i < 10; i++) {

            promise.then(function{
                collection.update({
                   symbol: items[i].symbol
                }, {
                   $set: { 
                      value: 123
                   }
                }, {
                   upsert: true
               });  
            });
        }
   })
}

var promise = doSomething();
promise.then(function(){
    console.log("DONE");
    myDB.close();
    process.exit();
});

2 个答案:

答案 0 :(得分:1)

看起来你从MongoClient.connect方法得到了一个承诺,所以为什么不用它来链接在一起呢。我根据您的代码在下面放了一个快速示例:

function doSomething(db) {
    return new Promise(function(resolve, reject){
        var collection = db.collection(COLLETION_NAME);
        for (var i = 0; i < 10; i++) {
            collection.update({
               symbol: items[i].symbol
            }, {
               $set: { 
                  value: 123
               }
            }, {
               upsert: true
           });
        }

        resolve(db);
    })
}

function connectToDB() {
    return MongoClient.connect(DB_CONNECTION);
}

function closeDB(db) {
    return new Promise(function(resolve, reject){
         db.close();
         resolve();
    });
}

connectToDB().then(function(db){
    return doSomething(db);
}).then(function(db){
    return closeDB(db);
}).then(function(){
    console.log("DONE");
    process.exit();
}).catch(function(error){
    console.log('Something went wrong: ' + error);
});

答案 1 :(得分:0)

根据@RayonDabre的建议更新了代码

function doSomething() {
   return MongoClient.connect(DB_CONNECTION).then(function(db) {
        myDB = db;
        var collection = db.collection(COLLECTION_NAME);
        var promises = [];

        for (var i = 0; i < 10; i++) {
            var innerPromise = collection.update({
               symbol: items[i].symbol
            }, {
               $set: { 
                  value: 123
               }
            }, {
                upsert: true
            });  
            promises.push(innerPromise);
        }
        return Promise.all(promises);
   });
}


var promise = doSomething();
promise.then(function(){
    console.log("DONE");
    myDB.close();
    process.exit();
});