events.once(emitter, name[, options])
曆史
版本 | 變化 |
---|---|
v15.0.0 | 現在支持 |
v11.13.0、v10.16.0 | 添加於:v11.13.0、v10.16.0 |
參數
emitter
EventEmittername
<string>options
<Object>signal
<AbortSignal> 可用於取消等待事件。
- 返回: <Promise>
創建一個 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!
相關用法
- Node.js events.on(emitter, eventName[, options])用法及代碼示例
- Node.js events.setMaxListeners(n[, ...eventTargets])用法及代碼示例
- Node.js events.listenerCount(emitter, eventName)用法及代碼示例
- Node.js events.getEventListeners(emitterOrTarget, eventName)用法及代碼示例
- Node.js events.defaultMaxListeners用法及代碼示例
- Node.js EventEmitter emitter.eventNames()用法及代碼示例
- Node.js EventEmitter emitter[Symbol.for('nodejs.rejection')](err, eventName[, ...args])用法及代碼示例
- Node.js ecdh.getPrivateKey()用法及代碼示例
- Node.js EventEmitter emitter.listeners(eventName)用法及代碼示例
- Node.js EventEmitter emitter.rawListeners(eventName)用法及代碼示例
- Node.js EventEmitter emitter.removeListener(eventName, listener)用法及代碼示例
- Node.js EventEmitter emitter.emit(eventName[, ...args])用法及代碼示例
- Node.js ecdh.generateKeys()用法及代碼示例
- Node.js emitter.eventNames()用法及代碼示例
- Node.js EventEmitter emitter.once(eventName, listener)用法及代碼示例
- Node.js ecdh.computeSecret()用法及代碼示例
- Node.js ecdh.setPrivateKey()用法及代碼示例
- Node.js EventEmitter emitter.on(eventName, listener)用法及代碼示例
- Node.js ecdh.setPublicKey()用法及代碼示例
- Node.js ecdh.getPublicKey()用法及代碼示例
- Node.js EventEmitter emitter.prependListener(eventName, listener)用法及代碼示例
- Node.js EventEmitter emitter.prependOnceListener(eventName, listener)用法及代碼示例
- Node.js ServerHttp2Stream http2stream.pushStream(headers[, options], callback)用法及代碼示例
- Node.js http2.Http2ServerRequest request.url用法及代碼示例
- Node.js request.socket用法及代碼示例
注:本文由純淨天空篩選整理自nodejs.org大神的英文原創作品 events.once(emitter, name[, options])。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。