Есть ли способ ожидать несколько вызовов await в асинхронной функции?

#node.js #express #mongoose #async-await

#node.js #экспресс #мангуст #async-await

Вопрос:

эта функция считывает все мои документы Movie и анализирует определенные атрибуты; создавая новые документы в моей коллекции Person.

введите описание изображения здесь

СООБЩЕНИЕ ОБ ОШИБКЕ:————————————————

await Person.create({ ^^^^^ SyntaxError: await допустимо только в асинхронной функции

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

1. Вопросы здесь не должны содержать код в изображениях. Это затрудняет копирование / вставку кода в ответы, делает невозможным индексирование кода и комментариев, затрудняет некоторую доступность и т. Д… Пожалуйста, передайте код в виде текста и правильно отформатируйте. В качестве примера, если бы я хотел показать вам правильный способ написания вашего кода, мне пришлось бы вручную перепечатывать все, что у вас есть в этом изображении, что крайне неэффективно. Вы же не хотите, чтобы людям было сложно предлагать вам полные и подробные ответы.

Ответ №1:

Проверка Promise.all() : https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Promise/all Это позволяет вам ждать нескольких обещаний.

Ответ №2:

Редактировать
Как указано @jfriend00, Array.forEach ожидает синхронную функцию и не обрабатывает Promises / async / await . Чтобы использовать async amp; await, вы должны заменить все ваши варианты использования Array.forEach на цикл for:

 for (const movie of movieObj) { ... }
  

Что касается ожидания нескольких асинхронных вызовов, если вы хотите, чтобы эти вызовы действительно были асинхронными, а не ожидали каждого отдельного вызова, вы можете ожидать массив асинхронных вызовов, используя Promise.all . Поскольку он принимает массив обещаний, вы захотите использовать Array.map . Вы могли бы сделать это, например:

 await Promise.all(arrayWriters.map((el) => Person.create(...)));
  

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

1. Но .forEach() не поддерживает обещание, поэтому использование await в его обратном вызове НЕ приостановит цикл.

2. @jfriend00 Вы правы в этом, хороший улов. Вместо .forEach() этого OP должен полагаться на: for (let movie of movieObj) { await ... }

3. Да, и ваш ответ был бы лучшим ответом, если бы вы изменили его, чтобы не показывать использование .forEach() и показывать пользователю for цикла.