Как обрабатывать асинхронный код в цикле в JavaScript? - PullRequest
0 голосов
/ 07 октября 2018

Я обращаюсь к REST API SongKick в моем приложении ReactJS, используя Axios.

Я не знаю, сколько запросов я собираюсь сделать, потому что в каждом запросе есть предел данных, которыеЯ могу получить, поэтому в каждом запросе мне нужно запросить другую страницу.

Для этого я использую цикл for, например:

while (toContinue)
{
    axios.get(baseUrl.replace('{page}',page))
        .then(result => {
              ...
            if(result.data.resultsPage.results.artist === undefined)
                toContinue = false;
        });
    page++;
}

Теперь,проблема, с которой я сталкиваюсь, заключается в том, что мне нужно знать, когда все мои запросы будут выполнены.Я знаю о Promise.All, но чтобы использовать его, мне нужно знать точные URL-адреса, с которых я собираюсь получить данные, и в моем случае я не знаю их, пока не получу пустые результаты из запроса,это означает, что последний запрос является последним.

Конечно, этот вызов axios.get является асинхронным, поэтому я знаю, что мой код не является оптимальным и не должен быть написан таким образом, но я искал этот видпроблемы и не может найти правильное решение.

Есть ли способ узнать, когда весь асинхронный код внутри функции завершен?Есть ли другой способ получить все страницы из REST API без зацикливания, потому что при использовании моего кода это вызовет дополнительные запросы (потому что это асинхронный вызов), хотя я достиг пустых результатов?

1 Ответ

0 голосов
/ 07 октября 2018

На самом деле ваш код приведет к аварийному завершению работы двигателя, поскольку цикл while будет работать вечно, поскольку он никогда не останавливается, асинхронные запросы запускаются, но они никогда не завершатся, поскольку поток заблокирован циклом.

Комуразрешите использование async / await для ожидания запроса перед продолжением цикла, поэтому фактически цикл не бесконечен:

async function getResults() {
 while(true) {
   const result = await axios.get(baseUrl.replace('{page}', page));
   // ...
   if(!result.data.resultsPage.results.artist)
     break;
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...