Повторить неудачные асинхронные операции - как избежать ожидания внутри циклов (no-await-in-l oop) в EsLint? - PullRequest
0 голосов
/ 07 августа 2020

У меня есть массив туров из JSON и я импортирую их все в базу данных.

Я использую for-l oop, потому что я хочу извлечь все туры с ошибками в другой файл, поэтому я можно исправить и повторно импортировать позже.

Вот мой код, и он работает, как ожидалось.


const importData = async () => {


  const tours = JSON.parse(
    await fs.readFile(path.join(__dirname, 'data', 'final.json'), 'utf8')
  );
 

  const errorTours = [];


  for (let i = 0; i < tours.length; i += 1) {

   const tour = tours[parseInt(i, 10)];

     try {
       await Tour.create(tour);
     } catch (e) {
       errorTours.push({ tour, error: e });
     }
  }


  await fs.writeFile('errorTour.json', JSON.stringify(errorTours));

  console.log('finished!!! :tada:');
}

но я получил «Disallow await внутри циклов (нет -await-in-l oop) «Ошибка EsLint.

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

Обычно код следует реорганизовать, чтобы создать все обещания сразу, а затем получить доступ к результатам с помощью Promise.all (). В противном случае каждая последующая операция не начнется, пока не будет завершена предыдущая.

Может быть, в моем случае Promise.allSettled () подойдет лучше, не так ли?

Я новичок в JS и совершенно запутался в том, как изменить мой код asyn c await на код Promise для использования Promise.allSettled.

Или есть лучший способ повторить асинхронные операции, которые были неудачными?

Вы можете показать мне направление в этом случае?

Спасибо,

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Как насчет этого?

 const TourPromises = tours.map(tour => Tour
    .create(tour)
    .catch(e => errorTours.push({tour, error: e}))
  )
 await Promise.all(TourPromises);

Удачи ...

0 голосов
/ 07 августа 2020

Вот мой проверенный, спасибо @Atlante Avila и Eslint docs

  const TourPromises = [];
  for (let i = 0; i < tours.length; i += 1) {
    const tour = tours[parseInt(i, 10)];

    TourPromises.push(
      Tour.create(tour).catch((e) => {
        errorTours.push({ tour, error: e });
      })
    );
  }

  await Promise.all(TourPromises);

старый код: потребовалось 5466.025282999966 миллисекунд.

новый код: заняло 1682,5688519999385 миллисекунд.

Выглядите лучше,

...