请先阅读一下 事件处理,观察者模式 源码实现

on, emit 是一种同步机制的

fs.open为例子,看一下到底什么时候产生了事件,什么时候触发,和EventEmitter有什么关系呢?

image.png
流程的一个说明:本图中详细绘制了从 异步调用开始—->异步调用请求封装—->请求对象传入I/O线程池完成I/O操作—->将完成的I/O结果交给I/O观察者—->从I/O观察者中取出回调函数和结果调用执行。

事件产生

  1. 关于事件你看图中第三部分,事件循环那里。Node.js 所有的异步 I/O 操作(net.Server fs.readStream 等)在完成后都会添加一个事件到事件循环的事件队列中

事件触发

  1. 事件的触发,我们只需要关注图中第三部分,事件循环会在事件队列中取出事件处理。fs.open产生事件的对象都是 events.EventEmitter 的实例,继承了EventEmitter,从事件循环取出事件的时候,触发这个事件和回调函数。

事件类型为error的问题

  1. 当我们直接为EventEmitter定义一个error事件,它包含了错误的语义,我们在遇到 异常的时候通常会触发 error 事件。

当 error 被触发时,EventEmitter 规定如果没有响 应的监听器,Node.js 会把它当作异常,退出程序并输出错误信息。

  1. var events = require('events');
  2. var emitter = new events.EventEmitter();
  3. emitter.emit('error');
  4. node.js:201
  5. throw e; // process.nextTick error, or 'error' event on first tick
  6. ^
  7. Error: Uncaught, unspecified 'error' event.
  8. at EventEmitter.emit (events.js:50:15)
  9. at Object.<anonymous> (/home/byvoid/error.js:5:9)
  10. at Module._compile (module.js:441:26)
  11. at Object..js (module.js:459:10)
  12. at Module.load (module.js:348:31)
  13. at Function._load (module.js:308:12)
  14. at Array.0 (module.js:479:10)
  15. at EventEmitter._tickCallback (node.js:192:40)

我们一般要为会触发 error 事件的对象设置监听器,避免遇到错误后整个程序崩溃。

作者:ikoala
链接:https://juejin.cn/post/6844903950546632717
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。