如何在Javascript中正确链接forEach循环中的promise

时间:2018-02-04 01:31:43

标签: javascript mongodb promise

我正在使用mongo并且需要为循环内的每个项目执行异步调用。我想在循环内的所有promise完成后执行另一个命令,但到目前为止,循环中的promise似乎是在循环之后的代码之后完成的。

基本上我想订购

循环承诺 然后 其他代码

而不是现在的

其他代码 循环承诺

MongoClient.connect(connecturl)
.then((client) => {
  databases.forEach((val) => {
    val.collection.forEach((valcol) => {
      client.db(val.databasename).stats() //(This is the async call)
      .then((stats) => {
        //Do stuff here with the stats of each collection
      })
    })
  })
})
.then(() => {
  //Do this stuff after everything is finished above this line
})
.catch((error) => {
}

任何协助都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

假设你使用.forEach()的东西是可迭代的(数组或类似的东西),你可以使用async/await来序列化for/of循环:

    MongoClient.connect(connecturl).then(async (client) => {
        for (let db of databases) {
            for (let valcol of db.collection) {
                let stats = await client.db(db.databasename).stats();
                // Do stuff here with the stats of each collection
            }
        }
    }).then(() => {
        // Do this stuff after everything is finished above this line
    }).catch((error) => {
        // process error
    })

如果您想坚持使用.forEach()循环,那么如果您并行执行并使用Promise.all()知道何时完成所有操作,您就可以完成所有工作:

MongoClient.connect(connecturl).then((client) => {
    let promises = [];
    databases.forEach((val) => {
        val.collection.forEach((valcol) => {
            let p = client.db(val.databasename).stats().then((stats) => {
                // Do stuff here with the stats of each collection
            });
            promises.push(p);
        }); 
    });
    return Promise.all(promises);
}).then(() => {
    // Do this stuff after everything is finished above this line
}).catch((error) => {
    // process error here
});