EventEmitter события заказа

Поскольку значение слова «порядок» является широким, позвольте мне объяснить случай, который меня интересует.

Довольно распространенный шаблон (хороший или плохой):

client = net.connect(...)
client.on('connect', () => {
  client.removeAllListeners('error');
  client.on('error', err => {
    ... // process IO errors
  });
  ...
});
client.on('error', err => {
  ... // process connection failures
});

Как я понимаю, это работает, возможно, что connectсобытие испускается, а позже errorиспускается IO. Но есть ли гарантия на EventEmitterуровне, что обработка событий действует как барьер (в правильной речи параллельного программирования).

Например, в этом случае я хотел бы видеть гарантию того, что connectобработчик удаляет error обработчик, настроенный только для ошибок соединения, и новый обработчик, настроенный только для ошибок ввода-вывода. Но будет ли новый список прослушивателей событий учитываться только во время следующего тика? Я хочу быть уверен, что взаимно исключенные обработчики в порядке программы (речь параллельного программирования: «removeAllListeners» и «on(‘error’)» отображаются выполненными в этом порядке, поэтому для обоих обработчиков невозможно получить одно и то же событие) также взаимно исключаются в порядке синхронизации (речь параллельного программирования: события «connect», «removeAllListeners», » on(error) «и» ошибка ввода-вывода » являются частью общего порядка синхронизации).

Речь идет о случае эмитент в целом, а не как соединение обогатительного комбината, потому что похожую картину можно увидеть и в других местах — например, то же соединение повторно использовать для обработки различных сделок, и должны привязать error обработчик для продолжительности отдельных операций, но не может себе позволить перекрывать обработчиков, или для обработки событий после сделки пошел дальше.

Есть ли такая гарантия EventEmitter? В противном случае, многие шаблоны, как выше, действительно должны быть закодированы гораздо более защищенно.

1 ответ

  1. Ни один из EventEmitterметодов не откладывает до следующего тика или ничего, они все делают всю свою работу в то время, когда они называются.

    При этом client.removeAllListeners('error');будут немедленно удалены все обработчики errorсобытий.