2016-01-20 2 views
0

Я хотел бы использовать поток запросов NodeJS несколько раз в двух разделенных промежуточных средах Koa, поэтому я добавил слушателей в свое «данные». Он работает сейчас, однако я боюсь, что за ним стоит гонка, потому что - на основе документации - после добавления первого обработчика событий поток начинает называть его, как только будут доступны какие-либо данные. Может случиться так, что второй прослушиватель событий не получит все куски, если между подписками есть другие коды? Или это как-то избегало (как?)?Поток NodeJS с несколькими обработчиками событий и данными о состоянии

Спасибо!

+0

Вы можете '.pause()' поток (не выпустить события 'data), присоединить слушателей событий, а затем' .resume() 'it. Во время паузы данные будут накапливаться во внутреннем буфере, пока вы его не возобновите. https://nodejs.org/api/stream.html#stream_readable_pause и https://nodejs.org/api/stream.html#stream_readable_resume – danneu

ответ

-1

Node.js использует EventEmitter для отправки событий. Любой, кто прослушивает событие (неважно, сколько слушателей там), получит событие. Таким образом, каждый из ваших подписчиков получит событие данных.

Документация предназначена для того, чтобы предупредить вас, что, прослушивая событие «данные», он переводит поток в «устаревший» режим (или потоки v1). Это означает, что если по какой-то причине один из ваших подписчиков пропустит сообщение, он исчезнет навсегда.

Однако Node.js также поддерживает потоковые трубопроводы. Вы можете подключить один читаемый поток к нескольким выходным потокам, и данные будут отправляться каждому из этих считывателей (с отдельным буфером чтения для каждого из них). В то же время, если прочитанный поток заканчивается, он завершает оба записываемых потока. Каждый поток будет иметь свой собственный буфер чтения, что означает, что они не пропустят никаких сообщений, если они перестанут слушать поток временно (по какой-то странной причине).

streamA.pipe(streamB) 
streamA.pipe(streamC)