@Soul1

Как использовать результаты async функции синхронно?

Имеется список url-адресов. Нужно на каждый адрес отправить request запрос, получить ответ и сохранить его в массив. На выходе должен получиться массив ответов. Как реализовать такое с помощью асинхронной функции?
Через XMLHttpRequest реализовал (синхронные выполнение), всё отлично отрабатывает, но запросы выполняются по очереди и скорость выполнения скрипта оставляет желать лучшего. Насколько я понимаю fetch умеет выполнять такое асинхронно, но не пойму как на выходе получить массив ответов не используя await. С await он отрабатывает как надо, но скорость такая же как и у XMLHttpRequest, т.е. если я ничего не путаю с помощью await мы принудительно синхронизируем выполнение функции, т.е. снова теряем скорость?

Функция:
spoiler
async function get_response(request_url_list) {
    var main_list = []
    //alert(JSON.stringify(response))
    for (var i = 0; i < request_url_list.length; i++) {
        let response = await fetch(request_url_list[i]);
        if (response.ok) { // если HTTP-статус в диапазоне 200-299 получаем тело ответа 
            let json = await response.json();
            main_list.push(JSON.stringify(json))
        } 
        else {
            alert("Ошибка HTTP: " + response.status);
        }
    }
    return main_list
}


Её вызов и сохранение результата:
var main_list = await get_response(request_url_list)
  • Вопрос задан
  • 100 просмотров
Решения вопроса 2
mmmaaak
@mmmaaak
Array.prototype.map + Promise.all
Ответ написан
Комментировать
Массив URL преобразуете в массив fetch(url)
Чтобы получить массив результатов из массива промисов погуглите про Promise.all
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
E1ON
@E1ON Куратор тега JavaScript
Programming, Gamedev, VR
Они в любом случае будут выполнятся по очереди. Async/Await это лишь обертка для удобной работы с промисами.
Почитайте про цикл событий и асинхронность в JS, ну и про промисы заодно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы