process.on('uncaughtException', (err) => { // something went unhandled. // Do any cleanup and exit anyway! console.error(err); // don't do just that. // FORCE exit the process too. process.exit(1); });
但是,假设在同一时间发生多个错误事件,这意味着上面的 uncaughtException 监听器将被多次触发,这可能会引起一些问题。
EventEmitter 模块暴露了 once 方法,这个方法发出的信号只会调用一次监听器。所以,这个方法常与 uncaughtException 一起使用。
监听器的顺序
如果针对一个事件注册多个监听器函数,当事件被触发时,这些监听器函数将按其注册的顺序被触发。
// first withTime.on('data', (data) => { console.log(`Length: ${data.length}`); }); // second withTime.on('data', (data) => { console.log(`Characters: ${data.toString().length}`); }); withTime.execute(fs.readFile, __filename);
上述代码会先输出 Length 信息,再输出 Characters 信息,执行的顺序与注册的顺序保持一致。
如果你想定义一个新的监听函数,但是希望它能够第一个被执行,你还可以使用 prependListener 方法:
withTime.on('data', (data) => { console.log(`Length: ${data.length}`); }); withTime.prependListener('data', (data) => { console.log(`Characters: ${data.toString().length}`); }); withTime.execute(fs.readFile, __filename);
上述代码中,Charaters 信息将首先被输出。
最后,你可以用 removeListener 函数来删除某个监听器函数。