美文网首页
Node.js EventEmitter

Node.js EventEmitter

作者: 龚达耶 | 来源:发表于2019-12-15 17:26 被阅读0次

    事件模块是Node.js对观察者模式的实现,通过EventEmitter属性提供构造函数。

    该函数提供两个常用函数 一个on 监听 一个 emit 发布

    const EventEmitter= require('events');
    const observer = new EventEmitter();
    observer.on('topic', ()=>{
      console.log('topic occured')
    })
    function main(){
      console.log(1)
      observer.emit('topic')
      console.log(2)
    }
    
    //1
    // topic occured
    //2
    
    

    EventEmitter 以注册的顺序同步地调用所有监听器。

    当然我们也可以将它变为异步使用setImmediate()

    const EventEmitter = require('events');
    const myEmitter = new EventEmitter();
    myEmitter.on('event', (a, b) => {
      setImmediate(() => {
        console.log('异步地发生');
      });
    });
    myEmitter.emit('event', 'a', 'b');
    

    我们也可以使用eventEmitter.once() 可以注册最多可调用一次的监听器。

    const EventEmitter = require('events');
    const myEmitter = new EventEmitter();
    let m =0;
    myEmitter.once('event', () => {
      console.log(++m);
    });
    myEmitter.emit('event');
    // 打印: 1
    myEmitter.emit('event');
    // 不触发
    

    如果实例报错Node.js就会崩溃

    const EventEmitter = require('events');
    const myEmitter = new EventEmitter();
    
    myEmitter.emit('error', new Error('错误信息'));
    

    最好的办法就是监听报错

    myEmitter.on('error', (err) => {
      console.error('错误信息');
    });
    

    我们也可以使用prependListener将事件监听器添加到监听器数组的开头。

    const myEE = new EventEmitter();
    myEE.on('foo', () => console.log('a'));
    myEE.prependListener('foo', () => console.log('b'));
    myEE.emit('foo');
    // 打印:
    //   b
    //   a
    

    使用prependOnceListener 当 eventName 事件下次触发时,监听器会先被移除,然后再调用。

    const EventEmitter = require('events');
    const myEE = new EventEmitter();
    myEE.on('foo', () => console.log('a'));
    myEE.prependOnceListener('foo', () => console.log('b'));
    myEE.emit('foo');
    myEE.emit('foo');
    // 打印:
    //   b
    //   a
    // a
    

    我们可以使用removeListener() 最多从监听器数组中移除一个监听器

    const myEmitter = new MyEmitter();
    
    const callbackA = () => {
      console.log('A');
      myEmitter.removeListener('event', callbackB);
    };
    
    const callbackB = () => {
      console.log('B');
    };
    
    myEmitter.on('event', callbackA);
    
    myEmitter.on('event', callbackB);
    
    // callbackA 移除了监听器 callbackB,但它依然会被调用。
    // 触发时内部的监听器数组为 [callbackA, callbackB]
    myEmitter.emit('event');
    // 打印:
    //   A
    //   B
    
    // callbackB 现已被移除。
    // 内部的监听器数组为 [callbackA]
    myEmitter.emit('event');
    // 打印:
    //   A
    

    在Node.js v11中新加入了events.once

    创建一个 Promise,当 EventEmitter 触发给定的事件时则会被解决,当 EventEmitter 触发 'error' 时则会被拒绝。 解决 Promise 时将会带上触发到给定事件的所有参数的数组。

    const { once, EventEmitter } = require('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('错误信息');
      process.nextTick(() => {
        ee.emit('error', err);
      });
    
      try {
        await once(ee, 'myevent');
      } catch (err) {
        console.log('出错', err);
      }
    }
    
    run();
    

    相关文章

      网友评论

          本文标题:Node.js EventEmitter

          本文链接:https://www.haomeiwen.com/subject/poqlnctx.html