我有一些异步代码在 JavaScript forEach
循环内运行。我想等到异步进程内的代码完成运行后再继续循环。
示例如下:
ids
是一个字符串数组。 db
是我为使用 MongoDB 创建的 Node 模块
var appIdsNotFound = "";
var count = 0;
ids.forEach(function(id) {
output[count] = {};
//console.log(id);
db.findApp(id, function(error, result) {
if(error) {
fatalError = true;
console.log(error);
} else {
if (result) {
output[count] = result;
//console.log(output[count]);
count++;
} else {
appNotFound = true;
appIdsNotFound += id + ", ";
console.log(appIdsNotFound);
}
}
});
});
//more code that we want to wait before executing
有没有办法在执行循环之外的其余代码之前等待,如果是的话,我将如何去做。
最佳答案
假设
db
是访问数据库的某个模块,请尝试查找同步版本。这假设您可以使用同步,因为您正在尝试以这种方式编写它,等待一切然后再继续。如果您的数据库库使用 Promise,您可以将其与
Promise.all
结合使用。对每个项目发出一个请求,将所有 Promise 收集到一个数组中,并将它们提供给Promise.all
。当所有 promise 都解决时,来自Promise.all
的 promise 将得到解决。const promises = ids.map(id => db.promiseReturningFindApp(id)); const allRequests = Promise.all(promises).then(responses => { // responses is an array of all results });
如果您的 API 没有 promise 返回版本,请将
db.findApp
包装在 promise 中,请执行建议 #2。function promiseReturningFindApp(id){ return new Promise((resolve, reject) => { db.findApp(id, (error, result) => { if(error) reject(error); else resolve(result); }); }); }
选项 2 和 3 是异步的,因此,从技术上讲,您不需要“等待”。因此,之后需要执行的代码只能驻留在回调中。
关于javascript - 如何等到循环内的异步进程完成后再退出循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39648984/