javascript - 仅在执行完异步函数后如何转到循环中的下一项?
问题描述
仅在异步函数成功执行后,如何执行循环中的下一项?
这是我当前代码的 sudo 代码:
async function myAsyncFunction(param) {
try {
// some code
} catch (error) {
// some code
}
}
const myArray = ["one", "two", "three", "four"];
for(let i = 0; i < myArray.length; i++) {
const resultOfMyAsyncFunction = myAsyncFunction(myArray[i]);
resultOfMyAsyncFunction.then(result => {
// some code
});
}
现在如果成功,它会处理数组中的所有项目,否则它会失败。我想一次尝试一件。如果成功,请尝试下一项。如果没有,请再试一次。
我在这里做错了什么?
for(let i = 0; i < myArray.length;) {
const resultOfMyAsyncFunction = myAsyncFunction(myArray[i]);
resultOfMyAsyncFunction.then(result => {
// some code
})
.then(i++) //Shouldn't i++ happen only after previous .then() is successful?
;
}
我正在寻找这个:
for(let i = 0; i < myArray.length;) {
const resultOfMyAsyncFunction = myAsyncFunction(myArray[i]);
resultOfMyAsyncFunction.then(result => {
// if result is successful, do something
i++;
//else try again
});
}
Bergi 的解决方案奏效了。
(async function() {
const myArray = ["one", "two", "three", "four"];
for(let i = 0; i < myArray.length; i++) {
const result = await myAsyncFunction(myArray[i]);
// ^^^^^
if (result) {
// do something
}
else {
i--;
}
}
})();
解决方案
由于您已经在使用async
/await
语法,只需await
在循环体中放置一个表达式而不是 using then
(它只是创建一个承诺,但不会阻塞循环)。
(async function() {
const myArray = ["one", "two", "three", "four"];
for(let i = 0; i < myArray.length; i++) {
const result = await myAsyncFunction(myArray[i]);
// ^^^^^
if (/* result is successful */) {
// do something
break;
}
// else it goes into next iteration to try again
}
})();
推荐阅读
- reactjs - 为什么我的 setTimeout 函数在 10 秒的时间跨度后仅显示一次控制台部分,但之后它会在 1 秒内打印控制台部分
- power-automate - 尽管处于相同的解决方案中,但流无法使用子流,因为它们处于不同的订阅中
- javascript - 从常量中提取常量(变量的可访问性)
- javascript - 从 React 中的同一个选择下拉表单字段中获取多个值
- laravel - 如何将子域添加到管理面板 Laravel 背包(backpackforlaravel)?
- wordpress - 如何使用 wordpress 开发服务器?
- swift - 将 UIButton 固定到照片上的特定位置
- android - 在没有虚拟设备的情况下测试我的 OpenGL ES 3.2 应用程序?
- firebase - Glide 4.11.0 中的 SSLHandshakeException(Connection closed by peer),同时显示来自 firebase 存储的图像
- c - Const Struct 与 Struct 与 Const 成员