Как я могу отправлять несколько HTTP-запросов параллельно с javascript и ждать, пока все они завершатся sh в синхронной функции - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь отправить несколько HTTP-запросов параллельно, используя JavaScript. Однако мне нужно дождаться завершения всех из них, прежде чем продолжить дальнейшее выполнение скрипта. При настройке я должен заблокировать основной поток, пока все запросы не будут выполнены (объяснение см. В разделе «Фон»). Есть ли способ сделать это чистым способом?

Пример

function sendRequest(url) {
    let xmlHttp = new XMLHttpRequest();
    xmlHttp.open("GET", url, true); // true for asynchronous
    xmlHttp.send(null);
}

let request1 = sendRequest("https://ressource1.com");
let request2 = sendRequest("https://ressource2.com");
let request3 = sendRequest("https://ressource3.com");
let request3 = sendRequest("https://ressource4.com");
// wait for the requests [request1, request2, request3, request4].

// only continue after all requests are done

Фон

Я пытаюсь написать PDF-Exporter, используя безголовый клиент хрома , Целью проекта является получение данных с удаленного сервера. Затем эти данные должны быть обработаны в HTML и экспортированы в PDF. Проблема заключается в том, что PDF-Export с флагом --print-to-pdf экспортирует PDF, когда:

  1. Состояние документа complete
  2. и весь синхронный код завершил выполнение

Состояние документа изменяется только после завершения всего синхронного кода из предыдущего состояния. Таким образом, можно предотвратить ранний экспорт, ожидая ответа на все запросы. Это проблема, как мне ждать несколько асин c запросов на окончание sh в синхронной функции?

Что я тестировал до сих пор

  1. Изменение состояния не ждет: Promise, Timeouts и async functions. Я протестировал эти варианты и не смог найти никаких решений
  2. Отправка запросов синхронно один за другим работает, но в четыре раза медленнее, чем отправка параллельно. (Это не будет жизнеспособным для более крупных проектов)
  3. Активно ждет всех запросов до конца sh. Это также работает, но требует большого количества ненужной производительности.
  4. Promise.all() и fetch() также не работают, потому что они просто возвращают обещание, не останавливая выполнение.

Надеюсь, объяснение понятно. Большое спасибо, что нашли время, чтобы прочитать это:)

...