Да, события синхронные и блокирующие. Они реализованы с помощью простых вызовов функций. Если вы посмотрите на код eventEmitter, чтобы отправить событие всем слушателям, он буквально просто перебирает массив слушателей и вызывает каждый обратный вызов слушателя, один за другим.
Теперь мне интересно, блокируют ли События код?
Да. В документе для .emit () это говорит: "Синхронно вызывает каждого из слушателей, зарегистрированных для события с именем eventName, в порядке их регистрации, передавая предоставленные аргументы каждому. "
И, дополнительная информация в документе в этом разделе Асинхронный против Синхронного , где говорится это:
EventEmitter вызывает всех слушателей синхронно в порядке их регистрации. Это важно для обеспечения правильной последовательности событий и во избежание состояния гонки или логических ошибок. При необходимости функции прослушивателя могут переключаться в асинхронный режим работы с помощью методов setImmediate () или process.nextTick ():
Если мне нужно обновить Feeds в фоновом режиме или после отправки ответа, каков правильный путь?
Ваш EventListener может планировать, когда он действительно хочет выполнить свой код с setTimeout()
, или setImmediate()
, или process.nextTick()
, если он хочет, чтобы другие слушатели и другой синхронный код завершили работу до того, как он выполнит свою работу. Таким образом, вы регистрируете обычного слушателя (который будет вызываться синхронно), а затем внутри него вы можете использовать setTimeout()
или setImmediate()
или process.nextTick()
и поместить фактическую работу в этот обратный вызов. Это задержит выполнение вашего кода до тех пор, пока не завершится выполнение текущего Javascript, который вызвал исходное событие.
Нет реальной «фоновой обработки» в node.js для чистого кода Javascript. node.js является однопоточным, поэтому пока вы запускаете какой-то Javascript, никакой другой Javascript не может быть запущен. Фактическая фоновая обработка должна выполняться либо с помощью существующих асинхронных операций (которые используют собственный код для запуска в фоновом режиме), таких как сетевой ввод-вывод или дисковый ввод-вывод), либо путем запуска другого процесса для выполнения работы (этот другой процесс). может быть кодом любого типа, включая другой процесс node.js).