當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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])。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。