Асинхронный цикл по массиву с ключом - PullRequest
0 голосов
/ 31 октября 2019

У меня есть массив клиентов, и я хочу просмотреть их и назначить каждому из них свойство. Объект customer с добавленным свойством возвращается через функцию details

for (let i = 0; i < customers.length; i++)
{
    customers[i] = await details(customers[i]);
}

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

async.forEachOf(customers, (customer, finished) async =>
{
    customer = await details(customer);
    finished();
});

Как еще я могу это сделать? Спасибо

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Этот код будет запускаться details() для каждого клиента один за другим, не дожидаясь предыдущего. Вы создаете массив обещаний и ждете их всех в конце

const promises = [];
for (let i = 0; i < customers.length; i++) {
    let p = new Promise(async (resolve, reject) => {
      customers[i] = await details(customers[i]);
      resolve();
    });
    promises.push(p);
}
await Promise.all(promises);
0 голосов
/ 31 октября 2019

Вам не нужна сторонняя библиотека для этого. Просто используйте Promise.all() и Array.prototype.map().

const customerDetails = await Promise.all(
  customers.map(customer => details(customer))
);
...