この記事は JavaScript アドベントカレンダーの 2 日目の分です。
Node.js の Events モジュールでは、events.on
メソッドを提供しています (EventEmitter
オブジェクトの on
メソッドとは別物です)。これは、イベントが列挙されるような非同期イテレータを生成するものです。第 1 引数にイベントを発生させる EventEmitter
オブジェクトまたは EventTarget
オブジェクトを、第 2 引数に列挙したいイベントの名前を指定します。
以下の例では、実行すると 1 秒後と 3 秒後にそれぞれ「foo イベントが発生しました」と出力されます。
// events-on.mjs
import { on } from 'events';
const target = new EventTarget();
setTimeout(() => {
target.dispatchEvent(new Event('foo'));
}, 1000);
setTimeout(() => {
target.dispatchEvent(new Event('foo'));
}, 3000);
(async () => {
for await (const [event] of on(target, 'foo')) {
console.log(`${event.type} イベントが発生しました。`)
}
})();
RxJS の Observable.fromEvent
メソッドと機能が似ていますね。
ブラウザ上でも使えると面白い書き方ができるのかもしれませんが、Events モジュールのブラウザ用実装では events.on
メソッドに対応していません。issue は立っており、作業ブランチも存在するものの、半年以上動きがなさそうです。
セコメントをする