Как перейти к следующему элементу в цикле только после выполнения асинхронной функции? - PullRequest
0 голосов
/ 06 февраля 2019

Как я могу выполнить следующий элемент в цикле только после успешного завершения выполнения асинхронной функции?

Вот код 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
    }); 
}

Решение Берги сработало.

(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--;
        }
    }
})();

1 Ответ

0 голосов
/ 06 февраля 2019

Поскольку вы уже используете синтаксис async / await, просто поместите выражение await в тело цикла вместо использования 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
    }
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...