gpt4 book ai didi

javascript - 如何等到循环内的异步进程完成后再退出循环?

转载 作者:行者123 更新时间:2023-12-03 06:03:28 24 4
gpt4 key购买 nike

我有一些异步代码在 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

有没有办法在执行循环之外的其余代码之前等待,如果是的话,我将如何去做。

最佳答案

  1. 假设db是访问数据库的某个模块,请尝试查找同步版本。这假设您可以使用同步,因为您正在尝试以这种方式编写它,等待一切然后再继续。

  2. 如果您的数据库库使用 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
    });
  3. 如果您的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com