Является ли код блокировки Eventemitter или нет - PullRequest
0 голосов
/ 11 мая 2018

Я работаю над проектом, где у меня есть страница Feeds, которая показывает все типы сообщений всех пользователей. Введите конкретную страницу списка и страницу сведений о сообщениях.

Pages- 1. Ленты 2. Список (конкретный тип) 3. Деталь (деталь поста)

Итак, у меня есть следующая коллекция Монго - 1. Корм 2. type1 post 3. type2 post 4. type3 ...

Теперь, когда пользователь публикует новое сообщение, я сохраняю его в соответствующую коллекцию, например, отправляем сообщение «type1» и возвращаем успех в браузер. Но я также хочу обновить свою коллекцию «Feed» теми же данными. Я не хочу, чтобы это было сделано до отправки ответа. Потому что это увеличит время ожидания пользователя. Поэтому я использовал События. Вот мой код -

const emitter = new event.EventEmitter();

function savePost(){
    //  Code to save data to Mongo collection

    emitter.emit('addToFeeds', data);
    console.log('emit done');

    return res.json(data);
}

emitter.on('addToFeeds', function(data){
    // code to save data to Feeds collection
    console.log('emitter msg - ', data);
});

Теперь, когда я проверяю вывод console.log, он сначала показывает «emitter msg -», а затем «emit done». Вот почему я предполагаю, что код emitter.on выполняется перед res.json (data);

Теперь мне интересно, блокируют ли События код? Если мне нужно обновить каналы в фоновом режиме или после отправки ответа, что является правильным способом? В будущем я также хочу реализовать кеширование, поэтому мне также придется обновлять кеш при добавлении даже поста, что я тоже хочу делать после отправки ответа или в фоновом режиме.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Да, события синхронные и блокирующие. Они реализованы с помощью простых вызовов функций. Если вы посмотрите на код 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).

0 голосов
/ 11 мая 2018

События являются синхронными и будут блокироваться.Это сделано для того, чтобы вы могли связывать события в определенном порядке и каскадировать их в этом порядке.Вы можете сделать каждый элемент асинхронным, и если вы делаете HTTP-запросы на эти события, это произойдет асинхронно, но сами события запускаются синхронно.

См .: https://nodejs.org/api/events.html#events_emitter_emit_eventname_args

И: https://nodejs.org/api/events.html#events_asynchronous_vs_synchronous

...