Как сделать цикл async / await? - PullRequest
       14

Как сделать цикл async / await?

0 голосов
/ 03 сентября 2018

Мне нужно повторить блок async / await несколько раз, но я не могу использовать следующий код:

for (let i = 0; i <= 10; i += 1) {
   const res = await DoSomething();
 }

потому что это противоречит правилу без ожидания в цикле.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

В ES 9 добавлена ​​новая функция асинхронной итерации.

for await (const line of readLines(filePath)) {
   console.log(line);
}

Вы можете попробовать это. Надеюсь, что это работает.

0 голосов
/ 03 сентября 2018

Используйте Promise.all, если порядок итераций не имеет значения

Если вы не возражаете против того, чтобы код выполнялся не по порядку (то есть порядок каждой итерации не имеет значения), просто используйте Promise.all вместо:

const promises = [];

for (let i = 0; i <= 10; i += 1) {
  promises.push(DoSomething());
}

const responses = await Promise.all(promises);

От MDN :

Метод Promise.all (iterable) возвращает одно Promise, которое разрешается, когда все обещания в итерируемом аргументе разрешены

Или отключить правило для этого блока

В противном случае, если вам нужно выполнить последовательную работу, просто отключите правило для этого блока:

/* eslint-disable no-await-in-loop */
for (let i = 0; i <= 10; i += 1) {
  const res = await DoSomething();
}
/* eslint-enable no-await-in-loop */

Но имейте в виду

Существует причина, по которой правило существует. Многие случаи, когда await используется в цикле, расточительны, так как каждая итерация не зависит от предыдущей, но каждая итерация ожидает разрешения предыдущей, прежде чем она даже попытается запустить следующую.

Promise.all более эффективен в этих случаях, поскольку он работает "параллельно", более или менее.

С Документы ESLint без ожидания в цикле :

Выполнение операции над каждым элементом итерируемой задачи является обычной задачей. Однако выполнение await как части каждой операции свидетельствует о том, что программа не в полной мере использует преимущества параллелизации async / await.

...