Как написать асинхронный для?

#javascript

#javascript

Вопрос:

Я работаю над некоторым кодом, и я понял, что у меня есть массив с более чем 100000 позициями, и мне нужно просмотреть все позиции массива. Однако я также понял, что могу «распараллелить for». Теперь вопрос, есть ли способ, которым я могу распараллелить значение по умолчанию для.

for(let i=0 ; i<limit ; i )

Комментарии:

1. Непонятно, о чем вы здесь просите. Javascript является однопоточным, поэтому запрос на распараллеливание чего-либо обычно невозможен (или, по крайней мере, не является тривиальным). В node вы можете создавать дочерние процессы, это то, что вы имеете в виду?

2. вы бы использовали await внутри async function

3. Марк Мейер, да, это то, что я имею в виду. В качестве примера я хочу вызвать n позиций в массиве для параллельного запуска и «освобождения» основного потока. Знаете ли вы библиотеку, чтобы сделать это жизнеспособным?

Ответ №1:

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

 /**
 * @param {Array}  arr: Array of items to loop over
 * @param {Function} cb: Callback function which needs to be executed per item
 * @returns Promise object which will be resolved once all the items have been executed
 */
function asyncFor(arr, cb) {
  const asyncCB = (item) => new Promise(resolve => resolve(cb(item)));
  return Promise.all(arr.map(item => asyncCB(item)));
}
  

Комментарии:

1. Обертывание вещей в promises не заставляет их выполняться параллельно. Ваши обратные вызовы по-прежнему будут выполняться по одному за раз.

Ответ №2:

Что-то вроде параллельного потока в java8 ? Создайте пул рабочих, перенаправьте вызовы другому рабочему, соберите результаты и продолжайте..