Ожидайте... отложите в цикле forEach

Должен ли этот код возвращать 12334 или 12433?

Я ожидаю 12334, но это дает 12433...

console.log '1'
anArray.forEach (info, index, array)->
  console.log '2'

  await model.findOne info, defer(err, doc)
  console.log '3'

console.log '4'

1 ответ

Решение

Ваша интуиция неверна: IcedCoffeeScript's await...defer не может заблокировать синхронный forEach петля.

Помните, что IcedCoffeeScript компилируется в JavaScript, который не поддерживает блокировку. Как только вы позвонили forEach в массиве вы обязались выполнить итерацию по всему массиву до того, как сработают какие-либо события.

Хорошей новостью является то, что вы можете получить желаемое поведение, используя собственные циклические конструкции IcedCoffeeScript. В твоем случае,

for info, index in anArray ->
  ...

Для получения дополнительной информации о работе с неблокирующей моделью событий JavaScript, посмотрите мою новую книгу, Async JavaScript.

Другие вопросы по тегам