ee-first
在一组 EventEmitter 和 event pairs 中获取第一个事件回调,然后清理其余的监听。
安装
npm install ee-first
API
const first = require('ee-first')
first(arr, listener)
* arr 二维数组
* listener <Function> (err, ee, event, args) 回调一次
err: error event
ee: eventemitter
event: 事件名
args: 事件发生时的参数(数组)
cancel()
清除 listener
源码
module.exports = first
/**
* 在一组 EventEmitter 和 event pairs 中获取第一个事件回调
*
* @param {array} stuff
* @param {function} done
* @public
*/
function first (stuff, done) {
if (!Array.isArray(stuff)) { // stuff 为数组
throw new TypeError('arg must be an array of [ee, events...] arrays')
}
var cleanups = []
for (var i = 0; i < stuff.length; i++) {
var arr = stuff[i]
if (!Array.isArray(arr) || arr.length < 2) { // 判断 stuff 为二维数组
throw new TypeError('each array member must be [ee, events...]')
}
var ee = arr[0] // 去除所有的 EventEmitter
for (var j = 1; j < arr.length; j++) {
var event = arr[j]
var fn = listener(event, callback)
// 依次监听所有的事件
ee.on(event, fn)
// 将所有的 EventEmitter 的所有事件添加到清初数组中
cleanups.push({
ee: ee,
event: event,
fn: fn
})
}
}
// 事件发生后执行对应的回调
function callback () {
cleanup() // 清除所有事件
done.apply(null, arguments) // 执行 first 传进来的回调
}
// 依次清楚所有 EventEmitter 的所有事件
function cleanup () {
var x
for (var i = 0; i < cleanups.length; i++) {
x = cleanups[i]
x.ee.removeListener(x.event, x.fn)
}
}
function thunk (fn) {
done = fn
}
thunk.cancel = cleanup
return thunk
}
/**
* 封装一个 EventEmitter 的回调
* @private
*/
function listener (event, done) {
return function onevent (arg1) {
var args = new Array(arguments.length)
var ee = this
// 判断是否事 error 事件,如果是取事件回调的第一个参数(也就是 Error 对象)
var err = event === 'error'
? arg1
: null
// 复制所有事件回调的参数
for (var i = 0; i < args.length; i++) {
args[i] = arguments[i]
}
done(err, ee, event, args)
}
}