События¶
Стабильность: 2 – Стабильная
АПИ является удовлетворительным. Совместимость с NPM имеет высший приоритет и не будет нарушена кроме случаев явной необходимости.
Большая часть API ядра Node.js построена вокруг идиоматической асинхронной событийно-ориентированной архитектуры, в которой определенные типы объектов (называемые "эмиттерами") испускают именованные события, которые вызывают объекты функции
("слушатели").
Например: объект net.Server
излучает событие каждый раз, когда к нему подключается пир; fs.ReadStream
излучает событие, когда открывается файл; stream излучает событие каждый раз, когда данные доступны для чтения.
Все объекты, которые испускают события, являются экземплярами класса EventEmitter
. Эти объекты открывают функцию eventEmitter.on()
, которая позволяет прикрепить одну или несколько функций к именованным событиям, испускаемым объектом. Обычно имена событий представляют собой строки в верблюжьем регистре, но можно использовать любой допустимый ключ свойства JavaScript.
Когда объект EventEmitter
испускает событие, все функции, присоединенные к этому конкретному событию, вызываются синхронно. Любые значения, возвращенные вызванными слушателями, игнорируются и отбрасываются.
В следующем примере показан простой экземпляр EventEmitter
с одним слушателем. Метод eventEmitter.on()
используется для регистрации слушателей, а метод eventEmitter.emit()
используется для запуска события.
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 7 8 9 |
|
Передача аргументов и this
слушателям¶
Метод eventEmitter.emit()
позволяет передавать произвольный набор аргументов в функции слушателя. Помните, что при вызове обычной функции слушателя стандартное ключевое слово this
намеренно устанавливается для ссылки на экземпляр EventEmitter
, к которому прикреплен слушатель.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Можно использовать стрелочные функции ES6 в качестве слушателей, однако при этом ключевое слово this
больше не будет ссылаться на экземпляр EventEmitter
:
1 2 3 4 5 6 7 8 |
|
1 2 3 4 5 6 7 8 |
|
Асинхронность против синхронности¶
Устройство EventEmitter
вызывает всех слушателей синхронно в том порядке, в котором они были зарегистрированы. Это обеспечивает правильную последовательность событий и помогает избежать условий гонки и логических ошибок. При необходимости функции слушателей могут переходить в асинхронный режим работы с помощью методов setImmediate()
или process.nextTick()
:
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 7 8 9 |
|
Обработка событий только один раз¶
Когда слушатель зарегистрирован с помощью метода eventEmitter.on()
, этот слушатель вызывается каждый раз, когда испускается названное событие.
1 2 3 4 5 6 7 8 9 10 11 |
|
1 2 3 4 5 6 7 8 9 10 11 |
|
Используя метод eventEmitter.once()
, можно зарегистрировать слушатель, который вызывается не более одного раза для определенного события. Как только событие произойдет, слушатель будет снят с регистрации и тогда вызван.
1 2 3 4 5 6 7 8 9 10 11 |
|
1 2 3 4 5 6 7 8 9 10 11 |
|
События ошибки¶
Когда в экземпляре EventEmitter
возникает ошибка, типичным действием является выдача события 'error'
. В Node.js это рассматривается как особый случай.
Если у EventEmitter
нет не хотя бы одного слушателя, зарегистрированного для события 'error'
, и событие 'error'
испускается, ошибка отбрасывается, печатается трассировка стека, и процесс Node.js завершается.
1 2 3 4 5 |
|
1 2 3 4 5 |
|
Для защиты от сбоя процесса Node.js можно использовать модуль domain
. (Заметим, однако, что модуль node:domain
устарел).
В качестве лучшей практики всегда следует добавлять слушателей для событий error
.
1 2 3 4 5 6 7 8 |
|
1 2 3 4 5 6 7 8 |
|
Можно отслеживать события error
без потребления излучаемой ошибки, установив слушателя с помощью символа events.errorMonitor
.
1 2 3 4 5 6 7 8 |
|
1 2 3 4 5 6 7 8 9 10 11 |
|
Перехват отказов обещаний¶
Использование функций async
с обработчиками событий проблематично, поскольку может привести к необработанному отказу в случае брошенного исключения:
1 2 3 4 5 |
|
1 2 3 4 5 |
|
Опция captureRejections
в конструкторе EventEmitter
или глобальная настройка изменяют это поведение, устанавливая обработчик .then(undefined, handler)
на Promise
. Этот обработчик направляет исключение асинхронно в метод Symbol.for('nodejs.rejection')
, если он есть, или в обработчик событий 'error'
, если его нет.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Установка events.captureRejections = true
изменит значение по умолчанию для всех новых экземпляров EventEmitter
.
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 7 8 |
|
События 'error'
, которые генерируются поведением captureRejections
, не имеют обработчика catch
, чтобы избежать бесконечных циклов ошибок: рекомендуется не использовать функции async
в качестве обработчиков событий 'error'
.
Класс: EventEmitter
¶
Класс EventEmitter
определяется и раскрывается модулем node:events
:
1 |
|
1 |
|
Все EventEmitter
испускают событие 'newListener'
при добавлении новых слушателей и 'removeListener'
при удалении существующих слушателей.
Он поддерживает следующую опцию:
captureRejections
<boolean>
Включает автоматический перехват отказов обещаний. По умолчанию:false
.
Событие: 'newListener'
¶
eventName
{string|symbol} Имя события, которое прослушиваетсяlistener
<Function>
Функция обработчика события
Экземпляр EventEmitter
будет испускать свое собственное событие 'newListener'
до того, как слушатель будет добавлен в его внутренний массив слушателей.
Слушателям, зарегистрированным для события 'newListener'
, передается имя события и ссылка на добавляемый слушатель.
Тот факт, что событие запускается до добавления слушателя, имеет тонкий, но важный побочный эффект: любые дополнительные слушатели, зарегистрированные на то же имя
в рамках обратного вызова 'newListener'
, вставляются перед слушателем, который находится в процессе добавления.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Событие: 'removeListener'
¶
eventName
{string|symbol} Имя событияlistener
<Function>
Функция обработчика события
Событие 'removeListener'
испускается после удаления listener'
.
emitter.addListener(eventName, listener)
¶
eventName
{string|symbol}listener
<Function>
Псевдоним для emitter.on(eventName, listener)
.
emitter.emit(eventName[, ...args])
¶
Синхронно вызывает каждый из слушателей, зарегистрированных для события с именем eventName
, в порядке их регистрации, передавая каждому из них указанные аргументы.
Возвращает true
, если у события были слушатели, false
в противном случае.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
emitter.eventNames()
¶
- Возвращает:
<Array>
Возвращает массив, содержащий список событий, для которых эмиттер зарегистрировал слушателей. Значения в массиве - это строки или символы
.
1 2 3 4 5 6 7 8 9 10 11 |
|
1 2 3 4 5 6 7 8 9 10 11 |
|
emitter.getMaxListeners()
¶
- Возвращает:
<integer>
Возвращает текущее максимальное значение слушателя для EventEmitter
, которое либо установлено emitter.setMaxListeners(n)
, либо по умолчанию равно events.defaultMaxListeners
.
emitter.listenerCount(eventName)
¶
eventName
{string|symbol} Имя события, которое прослушивается- Возвращает:
<integer>
Возвращает количество слушателей, прослушивающих событие с именем eventName
.
emitter.listeners(eventName)
¶
eventName
{string|symbol}- Возвращает: {функция[]}
Возвращает копию массива слушателей для события с именем eventName
.
1 2 3 4 5 |
|
emitter.off(eventName, listener)
¶
eventName
{string|symbol}listener
<Function>
- Возвращает:
<EventEmitter>
Псевдоним для emitter.removeListener()
.
emitter.on(eventName, listener)
¶
eventName
{string|symbol} Имя события.listener
<Function>
Функция обратного вызова.- Возвращает:
<EventEmitter>
Добавляет функцию listener
в конец массива слушателей для события с именем eventName
. Не проверяется, не был ли listener
уже добавлен. Многократные вызовы, передающие одну и ту же комбинацию eventName
и listener
, приведут к тому, что listener
будет добавлен и вызван несколько раз.
1 2 3 |
|
Возвращает ссылку на EventEmitter
, так что вызовы могут быть объединены в цепочку.
По умолчанию слушатели событий вызываются в порядке их добавления. В качестве альтернативы можно использовать метод emitter.prependListener()
для добавления слушателя события в начало массива слушателей.
1 2 3 4 5 6 7 8 |
|
1 2 3 4 5 6 7 8 |
|
emitter.once(eventName, listener)
¶
eventName
{string|symbol} Имя события.listener
<Function>
Функция обратного вызова.- Возвращает:
<EventEmitter>
Добавляет одноразовую функцию слушателя
для события с именем eventName
. При следующем срабатывании eventName
этот слушатель удаляется, а затем вызывается.
1 2 3 |
|
Возвращает ссылку на EventEmitter
, так что вызовы могут быть объединены в цепочку.
По умолчанию слушатели событий вызываются в порядке их добавления. В качестве альтернативы можно использовать метод emitter.prependOnceListener()
для добавления слушателя события в начало массива слушателей.
1 2 3 4 5 6 7 8 |
|
1 2 3 4 5 6 7 8 |
|
emitter.prependListener(eventName, listener)
¶
eventName
{string|symbol} Имя события.listener
<Function>
Функция обратного вызова.- Возвращает:
<EventEmitter>
Добавляет функцию listener
в начало массива слушателей для события с именем eventName
. Не проверяется, не был ли слушатель
уже добавлен. Многократные вызовы, передающие одну и ту же комбинацию eventName
и listener
, приведут к тому, что listener
будет добавлен и вызван несколько раз.
1 2 3 |
|
Возвращает ссылку на EventEmitter
, так что вызовы могут быть соединены в цепочку.
emitter.prependOnceListener(eventName, listener)
¶
eventName
{string|symbol} Имя события.listener
<Function>
Функция обратного вызова.- Возвращает:
<EventEmitter>
Добавляет одноразовую функцию слушателя
для события с именем eventName
в начало массива слушателей. При следующем срабатывании eventName
этот слушатель удаляется, а затем вызывается.
1 2 3 |
|
Возвращает ссылку на EventEmitter
, так что вызовы могут быть объединены в цепочку.
emitter.removeAllListeners([eventName])
¶
eventName
{string|symbol}- Возвращает:
<EventEmitter>
Удаляет всех слушателей или слушателей указанного eventName
.
Плохой практикой является удаление слушателей, добавленных в другом месте кода, особенно если экземпляр EventEmitter
был создан каким-либо другим компонентом или модулем (например, сокеты или файловые потоки).
Возвращает ссылку на EventEmitter
, так что вызовы могут быть объединены в цепочку.
emitter.removeListener(eventName, listener)
¶
eventName
{string|symbol}listener
<Function>
- Возвращает:
<EventEmitter>
Удаляет указанный listener
из массива слушателей для события с именем eventName
.
1 2 3 4 5 6 |
|
Функция removeListener()
удалит из массива слушателей не более одного экземпляра слушателя. Если какой-либо один слушатель был добавлен в массив слушателей несколько раз для указанного eventName
, то removeListener()
должен быть вызван несколько раз для удаления каждого экземпляра.
Как только событие испущено, все слушатели, прикрепленные к нему на момент испускания, вызываются по порядку. Это означает, что любые вызовы removeListener()
или removeAllListeners()
после испускания и до завершения выполнения последнего слушателя не удалят их из emit()
в процессе выполнения. Последующие события ведут себя так, как ожидалось.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
Поскольку управление слушателями осуществляется с помощью внутреннего массива, вызов этой функции изменит индексы позиций всех слушателей, зарегистрированных после удаляемого слушателя. Это не повлияет на порядок вызова слушателей, но это означает, что все копии массива слушателей, возвращаемые методом emitter.listeners()
, должны быть созданы заново.
Когда одна функция была добавлена в качестве обработчика несколько раз для одного события (как в примере ниже), removeListener()
удалит последний добавленный экземпляр. В примере удаляется слушатель once('ping')
:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Возвращает ссылку на EventEmitter
, так что вызовы могут быть объединены в цепочку.
emitter.setMaxListeners(n)
¶
n
<integer>
- Возвращает:
<EventEmitter>
По умолчанию EventEmitter
выводит предупреждение, если для определенного события добавлено более 10
слушателей. Это полезное значение по умолчанию, которое помогает найти утечки памяти. Метод emitter.setMaxListeners()
позволяет изменить это ограничение для данного экземпляра EventEmitter
. Значение может быть установлено в бесконечность
(или 0
), чтобы указать неограниченное количество слушателей.
Возвращает ссылку на EventEmitter
, так что вызовы могут быть объединены в цепочку.
emitter.rawListeners(eventName)
¶
eventName
{string|symbol}- Возвращает: {функция[]}
Возвращает копию массива слушателей для события с именем eventName
, включая любые обертки (например, созданные .once()
).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
emitter[Symbol.for('nodejs.rejection')](err, eventName[, ...args])
¶
err
ОшибкаeventName
{string|symbol}...args
<any>
Метод Symbol.for('nodejs.rejection')
вызывается в том случае, если при эмиссии события происходит отказ от обещания и на эмиттере включена функция captureRejections
. Можно использовать events.captureRejectionSymbol
вместо Symbol.for('nodejs.rejection')
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
events.defaultMaxListeners
¶
По умолчанию для любого отдельного события может быть зарегистрировано не более 10
слушателей. Это ограничение можно изменить для отдельных экземпляров EventEmitter
с помощью метода emitter.setMaxListeners(n)
. Чтобы изменить значение по умолчанию для всех экземпляров EventEmitter
, можно использовать свойство events.defaultMaxListeners
. Если это значение не является положительным числом, будет выдана ошибка RangeError
.
Будьте осторожны при установке events.defaultMaxListeners
, поскольку изменение влияет на все экземпляры EventEmitter
, включая те, которые были созданы до внесения изменения. Однако вызов emitter.setMaxListeners(n)
по-прежнему имеет приоритет над events.defaultMaxListeners
.
Это не жесткое ограничение. Экземпляр EventEmitter
позволит добавить больше слушателей, но выведет предупреждение в stderr о том, что была обнаружена "возможная утечка памяти EventEmitter". Для любого отдельного EventEmitter
можно использовать методы emitter.getMaxListeners()
и emitter.setMaxListeners()
, чтобы временно избежать этого предупреждения:
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 7 8 9 |
|
Флаг командной строки --trace-warnings
может быть использован для отображения стековой трассировки таких предупреждений.
Выданное предупреждение может быть проверено с помощью process.on('warning')
и будет иметь дополнительные свойства emitter
, type
и count
, ссылающиеся на экземпляр эмиттера события, имя события и количество подключенных слушателей, соответственно. Его свойство name
устанавливается в 'MaxListenersExceededWarning'
.
events.errorMonitor
¶
Этот символ используется для установки слушателя только для мониторинга событий 'error'
. Слушатели, установленные с помощью этого символа, вызываются до вызова обычных слушателей 'error'
.
Установка слушателя с помощью этого символа не изменяет поведение процесса после возникновения события 'error'
. Поэтому процесс все равно завершится, если не установлен обычный `'error'``прослушиватель.
events.getEventListeners(emitterOrTarget, eventName)
¶
emitterOrTarget
{EventEmitter|EventTarget}eventName
{string|symbol}- Возвращает: {функция[]}
Возвращает копию массива слушателей для события с именем eventName
.
Для EventEmitter
это ведет себя точно так же, как вызов .listeners
для эмиттера.
Для EventTarget
это единственный способ получить слушателей события для цели события. Это полезно для отладки и диагностики.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
events.once(emitter, name[, options])
¶
emitter
<EventEmitter>
name
<string>
options
<Object>
signal
<AbortSignal>
Может использоваться для отмены ожидания события.
- Возвращает:
<Promise>
Создает Promise
, которое будет выполнено, когда EventEmitter
испустит данное событие, или которое будет отклонено, если EventEmitter
испустит 'error'
во время ожидания. Обещание Promise
будет разрешено массивом всех аргументов, испущенных для данного события.
Этот метод намеренно является общим и работает с интерфейсом веб-платформы EventTarget, который не имеет специальной семантики события 'error'
и не прослушивает событие 'error'
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
Специальная обработка события 'error'
используется только тогда, когда events.once()
используется для ожидания другого события. Если events.once()
используется для ожидания самого события 'error'
, то оно рассматривается как любое другое событие без специальной обработки:
1 2 3 4 5 6 7 8 9 10 11 |
|
1 2 3 4 5 6 7 8 9 10 11 |
|
Для отмены ожидания события можно использовать <AbortSignal>
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
Ожидание нескольких событий, испускаемых на process.nextTick()
¶
При использовании функции events.once()
для ожидания нескольких событий, испускаемых в одной и той же партии операций process.nextTick()
, или когда несколько событий испускаются синхронно, стоит обратить внимание на один крайний случай. В частности, поскольку очередь process.nextTick()
осушается перед очередью микрозадачи Promise
, и поскольку EventEmitter
испускает все события синхронно, возможно, что events.once()
пропустит событие.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Чтобы поймать оба события, создайте каждое из обещаний перед ожиданием любого из них, тогда станет возможным использовать Promise.all()
, Promise.race()
или Promise.allSettled()
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
events.captureRejections
¶
Значение: <boolean>
Изменение параметра по умолчанию captureRejections
для всех новых объектов EventEmitter
.
events.captureRejectionSymbol
¶
Значение: Symbol.for('nodejs.rejection')
.
Посмотрите, как написать пользовательский обработчик отказа.
events.listenerCount(emitter, eventName)
¶
Стабильность: 0 – устарело или набрало много негативных отзывов
Эта фича является проблемной и ее планируют изменить. Не стоит полагаться на нее. Использование фичи может вызвать ошибки. Не стоит ожидать от нее обратной совместимости.
Вместо этого используйте emitter.listenerCount()
.
emitter
<EventEmitter>
Эмиттер для запросаeventName
{string|symbol} Имя события
Метод класса, который возвращает количество слушателей для данного eventName
, зарегистрированных на данном emitter
.
1 2 3 4 5 6 7 |
|
1 2 3 4 5 6 7 8 9 10 |
|
events.on(emitter, eventName[, options])
¶
emitter
<EventEmitter>
eventName
{string|symbol} Имя события, которое прослушиваетсяoptions
<Object>
signal
<AbortSignal>
Может использоваться для отмены ожидающих событий.
- Возвращает:
<AsyncIterator>
, итератор событийeventName
, испускаемыхemitter
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Возвращает AsyncIterator
, который итерирует события eventName
. Если EventEmitter
выдает 'error'
, он будет выброшен. Он удаляет всех слушателей при выходе из цикла. Значение value
, возвращаемое каждой итерацией, представляет собой массив, состоящий из аргументов испускаемых событий.
Для отмены ожидания событий можно использовать <AbortSignal>
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
events.setMaxListeners(n[, ...eventTargets])
¶
n
<number>
Неотрицательное число. Максимальное количество слушателей для каждого событияEventTarget
....eventsTargets
{EventTarget[]|EventEmitter[]} Ноль или более экземпляров {EventTarget} или<EventEmitter>
. Если ни один из них не указан,n
устанавливается как максимальное значение по умолчанию для всех вновь создаваемых объектов {EventTarget} и<EventEmitter>
.
1 2 3 4 5 6 |
|
1 2 3 4 5 6 7 8 9 |
|
Класс: events.EventEmitterAsyncResource extends EventEmitter
¶
Интегрирует EventEmitter
с <AsyncResource>
для EventEmitter
, которые требуют ручного асинхронного отслеживания. В частности, все события, испускаемые экземплярами events.EventEmitterAsyncResource
, будут выполняться внутри его async контекста.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
Класс EventEmitterAsyncResource
имеет те же методы и принимает те же опции, что и EventEmitter
и AsyncResource
.
new events.EventEmitterAsyncResource([options])
¶
options
<Object>
captureRejections
<boolean>
Включает автоматическое фиксирование отказов от обещаний. По умолчанию:false
.name
<string>
Тип асинхронного события. По умолчанию::new.target.name
.triggerAsyncId
<number>
ID контекста выполнения, который создал это асинхронное событие. По умолчанию:executionAsyncId()
.requireManualDestroy
<boolean>
Если установлено значениеtrue
, отключаетemitDestroy
, когда объект собирается в мусор. Обычно это значение не нужно устанавливать (даже еслиemitDestroy
вызывается вручную), если только не полученasyncId
ресурса и с ним не вызываетсяemitDestroy
чувствительного API. Если установлено значениеfalse
, вызовemitDestroy
на сборку мусора будет происходить только при наличии хотя бы одного активного хукаdestroy
. По умолчанию:false
.
eventemitterasyncresource.asyncId
¶
- Тип:
<number>
УникальныйasyncId
, присвоенный ресурсу.
eventemitterasyncresource.asyncResource
¶
- Тип: Базовый
<AsyncResource>
.
Возвращаемый объект AsyncResource
имеет дополнительное свойство eventEmitter
, которое предоставляет ссылку на этот EventEmitterAsyncResource
.
eventemitterasyncresource.emitDestroy()
.¶
Вызывает все крючки destroy
. Эта функция должна быть вызвана только один раз. Если он будет вызван более одного раза, будет выдана ошибка. Это должно быть вызвано вручную. Если ресурс оставлен для сбора GC, то крючки destroy
никогда не будут вызваны.
eventemitterasyncresource.triggerAsyncId
¶
- Тип:
<number>
Тот жеtriggerAsyncId
, который передается конструкторуAsyncResource
.
EventTarget
и Event
API¶
Объекты EventTarget
и Event
являются специфической для Node.js реализацией EventTarget
Web API, которые открываются некоторыми API ядра Node.js.
1 2 3 4 5 |
|
Node.js EventTarget
vs. DOM EventTarget
¶
Есть два ключевых различия между Node.js EventTarget
и EventTarget
Web API:
- В то время как экземпляры DOM
EventTarget
могут быть иерархическими, в Node.js нет концепции иерархии и распространения событий. То есть, событие, отправленное наEventTarget
, не распространяется через иерархию вложенных целевых объектов, каждый из которых может иметь свой собственный набор обработчиков для этого события. - В Node.js
EventTarget
, если слушатель события является асинхронной функцией или возвращаетPromise
, и возвращенныйPromise
отклоняется, отказ автоматически перехватывается и обрабатывается так же, как и слушатель, который бросает синхронно (подробности см. вEventTarget
error handling).
NodeEventTarget
vs. EventEmitter
¶
Объект NodeEventTarget
реализует модифицированное подмножество API EventEmitter
, что позволяет ему в определенных ситуациях близко подражать EventEmitter
. Объект NodeEventTarget
не является экземпляром EventEmitter
и не может быть использован вместо EventEmitter
в большинстве случаев.
- В отличие от
EventEmitter
, любой данныйlistener
может быть зарегистрирован не более одного раза для каждоготипа события
. Попытки зарегистрироватьслушателя
несколько раз игнорируются. NodeEventTarget
не эмулирует полный APIEventEmitter
. В частности, не эмулируются APIprependListener()
,prependOnceListener()
,rawListeners()
иerrorMonitor
. События'newListener'
и'removeListener'
также не будут эмулироваться.- В
NodeEventTarget
не реализовано никакого специального поведения по умолчанию для событий с типом'error'
. - Цель
NodeEventTarget
поддерживает объектыEventListener
, а также функции в качестве обработчиков для всех типов событий.
Слушатель события¶
Слушатели событий, зарегистрированные для события типа
, могут быть либо функциями JavaScript, либо объектами со свойством handleEvent
, значением которого является функция.
В любом случае функция-обработчик вызывается с аргументом event
, переданным в функцию eventTarget.dispatchEvent()
.
Асинхронные функции могут использоваться в качестве слушателей событий. Если функция-обработчик async отклоняется, отказ фиксируется и обрабатывается, как описано в EventTarget
error handling.
Ошибка, вызванная одной функцией-обработчиком, не препятствует вызову других обработчиков.
Возвращаемое значение функции-обработчика игнорируется.
Обработчики всегда вызываются в том порядке, в котором они были добавлены.
Функции обработчика могут изменять объект event
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
EventTarget
обработка ошибок¶
Когда зарегистрированный слушатель событий бросает (или возвращает Promise, который отклоняет), по умолчанию ошибка рассматривается как не пойманное исключение на process.nextTick()
. Это означает, что не пойманные исключения в EventTarget
будут завершать процесс Node.js по умолчанию.
Бросок внутри слушателя события не остановит вызов других зарегистрированных обработчиков.
В EventTarget
не реализована какая-либо специальная обработка по умолчанию для событий типа 'error'
, как в EventEmitter
.
В настоящее время ошибки сначала направляются в событие process.on('error')
, прежде чем достигнут process.on('uncaughtException')
. Это поведение устарело и будет изменено в будущем выпуске, чтобы привести EventTarget
в соответствие с другими API Node.js. Любой код, полагающийся на событие process.on('error')
, должен быть приведен в соответствие с новым поведением.
Класс: Event
¶
Объект Event
является адаптацией Event
Web API. Экземпляры создаются внутри Node.js.
event.bubbles
¶
- Тип:
<boolean>
Всегда возвращаетfalse
.
Этот параметр не используется в Node.js и приведен исключительно для полноты картины.
event.cancelBubble
¶
Стабильность: 3 – Закрыто
Наследие: Вместо этого используйте event.stopPropagation()
.
- Тип:
<boolean>
Псевдоним для event.stopPropagation()
, если установлено значение true
. Он не используется в Node.js и приведен исключительно для полноты.
event.cancelable
¶
- Тип:
<boolean>
Истина, если событие было создано с опциейcancelable
.
event.composed
¶
- Тип:
<boolean>
Всегда возвращаетfalse
.
Этот параметр не используется в Node.js и приведен исключительно для полноты картины.
event.composedPath()
¶
Возвращает массив, содержащий текущую EventTarget
в качестве единственного элемента или пустой, если событие не отправляется. Этот параметр не используется в Node.js и приводится исключительно для полноты картины.
event.currentTarget
¶
- Тип: {EventTarget} Цель
EventTarget
, диспетчеризирующая событие.
Псевдоним для event.target
.
event.defaultPrevented
¶
- Тип:
<boolean>
Является true
, если cancelable
является true
и event.preventDefault()
был вызван.
event.eventPhase
¶
- Тип:
<number>
Возвращает0
, если событие не отправляется,2
, если отправляется.
Этот параметр не используется в Node.js и приводится исключительно для полноты картины.
event.isTrusted
¶
- Тип:
<boolean>
Событие <AbortSignal>
abort
испускается, если значение isTrusted
установлено в true
. Во всех остальных случаях значение false
.
event.preventDefault()
¶
Устанавливает свойство defaultPrevented
в true
, если cancelable
равно true
.
event.returnValue
¶
Стабильность: 3 – Закрыто
Принимаются только фиксы, связанные с безопасностью, производительностью или баг-фиксы. Пожалуйста, не предлагайте изменений АПИ в разделе с таким индикатором, они будут отклонены.
Вместо этого используйте event.defaultPrevented
.
- Тип:
<boolean>
Истинно, если событие не было отменено.
Значение event.returnValue
всегда противоположно event.defaultPrevented
. Этот параметр не используется в Node.js и приводится исключительно для полноты картины.
event.srcElement
¶
Стабильность: 3 – Закрыто
Принимаются только фиксы, связанные с безопасностью, производительностью или баг-фиксы. Пожалуйста, не предлагайте изменений АПИ в разделе с таким индикатором, они будут отклонены.
Вместо этого используйте event.target
.
- Тип: {EventTarget} Цель
EventTarget
, диспетчеризирующая событие.
Псевдоним для event.target
.
event.stopImmediatePropagation()
¶
Останавливает вызов слушателей событий после завершения текущего.
event.stopPropagation()
¶
Это не используется в Node.js и приводится исключительно для полноты картины.
event.target
¶
- Тип: {EventTarget} Цель
EventTarget
, диспетчеризирующая событие.
event.timeStamp
¶
- Тип:
<number>
Миллисекундная метка времени, когда был создан объект Event
.
event.type
¶
- Тип:
<string>
Идентификатор типа события.
Класс: EventTarget
¶
eventTarget.addEventListener(type, listener[, options])
¶
type
<string>
listener
{Function|EventListener}options
<Object>
once
<boolean>
Еслиtrue
, слушатель автоматически удаляется при первом вызове. По умолчанию:false
.passive
<boolean>
Когдаtrue
, служит подсказкой, что слушатель не будет вызывать методpreventDefault()
объектаEvent
. По умолчанию:false
.capture
<boolean>
Не используется непосредственно в Node.js. Добавлен для полноты API. По умолчанию:false
.signal
<AbortSignal>
Слушатель будет удален при вызове методаabort()
данного объекта AbortSignal.
Добавляет новый обработчик для события type
. Любой заданный listener
добавляется только один раз для каждого type
и для каждого значения опции capture
.
Если опция once
имеет значение true
, то слушатель
будет удален после следующего отправления события type
.
Опция capture
не используется Node.js каким-либо функциональным образом, кроме отслеживания зарегистрированных слушателей событий в соответствии со спецификацией EventTarget
. В частности, опция capture
используется как часть ключа при регистрации слушателя
. Любой отдельный слушатель
может быть добавлен один раз с capture = false
и один раз с capture = true
.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
eventTarget.dispatchEvent(event)
¶
event
{Event}- Возвращает:
<boolean>
true
, если либо значение атрибутаcancelable
события равно false, либо его методpreventDefault()
не был вызван, иначеfalse
.
Отправляет событие
в список обработчиков для event.type
.
Зарегистрированные обработчики событий синхронно вызываются в том порядке, в котором они были зарегистрированы.
eventTarget.removeEventListener(type, listener[, options])
¶
Удаляет listener
из списка обработчиков события type
.
Класс: CustomEvent
¶
Стабильность: 1 – Экспериментальная
Фича изменяется и не допускается флагом командной строки. Может быть изменена или удалена в последующих версиях.
- Расширяет: {Event}
Объект CustomEvent
является адаптацией CustomEvent
Web API. Экземпляры создаются внутри Node.js.
event.detail
¶
Стабильность: 1 – Экспериментальная
Фича изменяется и не допускается флагом командной строки. Может быть изменена или удалена в последующих версиях.
- Тип:
<any>
Возвращает пользовательские данные, переданные при инициализации.
Только для чтения.
Класс: NodeEventTarget
¶
- Расширяет: {EventTarget}
NodeEventTarget
- это специфическое для Node.js расширение EventTarget
, которое эмулирует часть API EventEmitter
.
nodeEventTarget.addListener(type, listener)
¶
-
type
<string>
-
listener
{Function|EventListener} -
Возвращает: {EventTarget} this
Node.js-специфическое расширение класса EventTarget
, которое эмулирует эквивалентный API EventEmitter
. Единственное различие между addListener()
и addEventListener()
заключается в том, что addListener()
возвращает ссылку на EventTarget
.
nodeEventTarget.eventNames()
¶
- Возвращает:
<string[]>
Node.js-специфическое расширение класса EventTarget
, которое возвращает массив имен событий типа
, для которых зарегистрированы слушатели событий.
nodeEventTarget.listenerCount(type)
¶
Node.js-специфическое расширение класса EventTarget
, которое возвращает количество слушателей событий, зарегистрированных для type
.
nodeEventTarget.setMaxListeners(n)
¶
n
<number>
Node.js-специфическое расширение класса EventTarget
, которое устанавливает число максимальных слушателей событий как n
.
nodeEventTarget.getMaxListeners()
¶
- Возвращает:
<number>
Node.js-специфическое расширение класса EventTarget
, которое возвращает количество максимальных слушателей событий.
nodeEventTarget.off(type, listener[, options])
¶
type
<string>
listener
{Function|EventListener}options
<Object>
capture
<boolean>
- Возвращает: {EventTarget} this
Node.js-специфический псевдоним для eventTarget.removeListener()
.
nodeEventTarget.on(type, listener)
¶
-
type
<string>
-
listener
{Function|EventListener} -
Возвращает: {EventTarget} this
Node.js-специфический псевдоним для eventTarget.addListener()
.
nodeEventTarget.once(type, listener)
¶
-
type
<string>
-
listener
{Function|EventListener} -
Возвращает: {EventTarget} this
Node.js-специфическое расширение класса EventTarget
, которое добавляет once
слушателя для заданного type
события. Это эквивалентно вызову on
с опцией once
, установленной в true
.
nodeEventTarget.removeAllListeners([type])
¶
-
type
<string>
-
Возвращает: {EventTarget} this
Специфическое для Node.js расширение класса EventTarget
. Если указан type
, удаляет всех зарегистрированных слушателей для type
, в противном случае удаляет всех зарегистрированных слушателей.
nodeEventTarget.removeListener(type, listener[, options])
¶
-
type
<string>
-
listener
{Function|EventListener} -
options
<Object>
capture
<boolean>
-
Возвращает: {EventTarget} this
Node.js-специфическое расширение класса EventTarget
, которое удаляет слушателя
для заданного типа
. Единственная разница между removeListener()
и removeEventListener()
заключается в том, что removeListener()
возвращает ссылку на EventTarget
.