#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
цикла.