[英]How to go to next item in the loop only after an async function is done executing?
僅在異步函數成功執行后,如何才能在循環中執行下一個項目?
這是我當前代碼的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
表達式即可,而不是使用then
(這會創建一個promise,但不會阻塞循環)。
(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
}
})();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.