без ожидания, совет об альтернативном решении - PullRequest
0 голосов
/ 19 сентября 2019

Я использую Express с mongoose для своего приложения и использую ESLint.У меня в приложении есть:

  • Некоторые категории, определенные именем, идентификатором и идентификаторами некоторых внешних категорий, которые соответствуют

  • Некоторыесобытия, определенные именем и категорией

Я делаю что-то вроде этого, чтобы получить категорию при создании события из json:

let promises = [];
for (let i = 0; i < events.length; i++) {
   const event = new Event({
      name: events[i].name,
      category: await Category.findOne({externalSource: events[I].category_id})
   });
   promises.push(event.save());
}
Promise.all(promises)...

Мой кодработает, но ESLint выдает ошибку no-await-in-loop.Я деактивировал его с помощью /* eslint-disable no-await-in-loop */, но я хотел бы знать, каково хорошее альтернативное решение, которое я должен сделать, соблюдая ограничение ESLint?

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

Спасибо

1 Ответ

1 голос
/ 19 сентября 2019

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

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

let tasks = [];
var counter = 0
for (let i = 0; i < events.length; i++) {
  Category.findOne({externalSource: events[i].category_id}).then(d => {
    counter++
    tasks.push(new Event({
      name: events[i].name,
      category: d
    }).save())
    if(counter === events.length){
      Promise.all(tasks).then(allData => {
        console.log('Done', allData)
      }).catch(console.error)
    }
  }).catch(console.error)
}
...