for循环中的嵌套promise未按预期运行

Nested promise in a for loop not behaving as expected

本文关键字:运行 promise 循环 嵌套 for      更新时间:2024-03-13

.then()内部扩展Promise时遇到问题。我正在尝试在for循环中执行数据库更新,然后在处理完所有记录后关闭数据库。然而,应用程序会立即退出process.exit(),这意味着process.exit()甚至在所有数据库更新完成之前就已执行。我很确定我在嵌套的promise上做错了什么。

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();
});

看起来你从MongoClient.connect方法中得到了一个promise,为什么不使用它来链接在一起呢。我根据你的代码在下面放了一个快速样本:

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);
});

根据@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();
});