ee-first源码分析
brunoyang opened this issue · 0 comments
brunoyang commented
仓库:https://github.com/jonathanong/ee-first
ee-first
是一个竞争事件收集器,可以为多个事件对象绑定多个事件,并在某个事件触发后移除该对象的所有事件。
本文根据ee-first@1.1.1
版本所撰写。
使用方法
'use strict';
const first = require('ee-first');
const event = require('events').EventEmitter;
const ee1 = new event();
const ee2 = new event();
const handle1 = first([[ee1, 'error', 'a', 'b']], function(err, ee, event, args) {
console.log(`err: ${err}\nee: ${ee}\nevent: ${event}\nargs: ${args}`);
})
const handle2 = first([[ee2, 'error', 'a', 'b']], function(err, ee, event, args) {
console.log(`err: ${err}\nee: ${ee}\nevent: ${event}\nargs: ${args}`);
})
ee1.emit('error', 'err msg');
// err: err msg
// ee: [object Object]
// event: error
// args: err msg
ee1.emit('b', 'whatever'); // nothing
// 移除所有绑定在ee2事件对象上的事件
handle2.cancel();
ee2.emit('b', 'sucks'); // also nothing
源码分析
这个模块暴露了一个first
方法,这个方法接受2个参数,事件数组和回调。事件数组是指一个二维数组,可以包含若干个数组,每个数组的第一个是元素是事件对象,如http
,net
等继承自EventEmitter
的对象。剩余的元素是所有需要绑定在该事件对象上的事件。第二个参数是事件绑定的回调,在这里为了便于区分,特称为事件回调
。
cleanups
数组是一个包含所有事件对象所绑定事件的数组。
进入循环后,变量fn
是listener
函数的返回值,listener
的作用是收集事件回调
的参数列表,并传入callback
函数,等待事件触发(emit
)。callback
函数做了两件事,执行cleanup
方法移除所有cleanups
数组中事件对象中的事件,并执行回调,这就表现竞争现象
。
cancel
方法直接调用cleanup
,移除所有事件。