.map()
не обещает знать. Он не смотрит на возвращаемое значение из каждой итерации, чтобы увидеть, является ли это обещанием, а затем приостанавливает l oop. Вместо этого он просто вслепую выполняет все итерации одну за другой. Когда вы возвращаете обещания от .map()
, которые вы используете с обратным вызовом async
, это просто означает, что ваши .map()
будут выдавать массив обещаний, и все ваши итерации l oop будут "в полете" одновременно время, не упорядоченное.
Если вы хотите выполнить итерацию al oop и приостановить l oop в каждой итерации до разрешения обещания, тогда используйте обычное for
l oop:
async function someFunc() {
for (let contact of anArray) {
await new Promise((res, rej) => {
const worker = new Worker('./http.worker', { type: 'module' });
worker.onmessage = () => {
res();
};
worker.postMessage(contact);
});
}
}
К вашему сведению, вызовы http в Javascript неблокируемые и асинхронные, поэтому не совсем понятно, почему вы делаете их в WebWorkers. Если вы не интенсивно используете процессор для обработки результата, вы можете выполнять запросы http в основном потоке без каких-либо блокировок.
Также к вашему сведению, для ряда различных вариантов обработки массива, только с N запросами в полете одновременно (где вы решаете, какое значение N), смотрите эти различные ответы:
runN(fn, limit, cnt, options)
: L oop через API на несколько запросов
pMap(array, fn, limit)
: Сделайте несколько запросов к API, который может обрабатывать только 20 одновременно
rateLimitMap(array, requestsPerSec, maxInFlight, fn)
: Правильный асинхронный c метод для максимальных запросов в секунду
mapConcurrent(array, maxConcurrent, fn)
: Promise.all () потребляет весь мой оперативный памяти
Существуют также функции для этого встроенные в Библиотека обещаний Bluebird и Asyn c -обещающая библиотека .