当前位置: 首页>>编程示例 >>用法及示例精选 >>正文


Node.js events.once(emitter, name[, options])用法及代码示例

events.once(emitter, name[, options])

历史
版本变化
v15.0.0

现在支持signal 选项。

v11.13.0、v10.16.0

添加于:v11.13.0、v10.16.0


参数

创建一个 Promise,当 EventEmitter 发出给定事件时完成,或者如果 EventEmitter 在等待时发出 'error' 则被拒绝。 Promise 将使用一个包含所有发送给给定事件的参数的数组来解析。

此方法是有意通用的,适用于 Web 平台 EventTarget 接口,该接口没有特殊的 'error' 事件语义并且不侦听 'error' 事件。

const { once, EventEmitter } = require('node:events');

async function run() {
  const ee = new EventEmitter();

  process.nextTick(() => {
    ee.emit('myevent', 42);
  });

  const [value] = await once(ee, 'myevent');
  console.log(value);

  const err = new Error('kaboom');
  process.nextTick(() => {
    ee.emit('error', err);
  });

  try {
    await once(ee, 'myevent');
  } catch (err) {
    console.log('error happened', err);
  }
}

run();

'error' 事件的特殊处理仅在events.once() 用于等待另一个事件时使用。如果 events.once() 用于等待 ' error' 事件本身,则将其视为任何其他类型的事件而无需特殊处理:

const { EventEmitter, once } = require('node:events');

const ee = new EventEmitter();

once(ee, 'error')
  .then(([err]) => console.log('ok', err.message))
  .catch((err) => console.log('error', err.message));

ee.emit('error', new Error('boom'));

// Prints: ok boom

<AbortSignal> 可用于取消等待事件:

const { EventEmitter, once } = require('node:events');

const ee = new EventEmitter();
const ac = new AbortController();

async function foo(emitter, event, signal) {
  try {
    await once(emitter, event, { signal });
    console.log('event emitted!');
  } catch (error) {
    if (error.name === 'AbortError') {
      console.error('Waiting for the event was canceled!');
    } else {
      console.error('There was an error', error.message);
    }
  }
}

foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!

相关用法


注:本文由纯净天空筛选整理自nodejs.org大神的英文原创作品 events.once(emitter, name[, options])。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。