我正在使用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) => {
}
任何协助都会受到赞赏。
答案 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
});