You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
1.6 KiB
95 lines
1.6 KiB
/*! |
|
* ee-first |
|
* Copyright(c) 2014 Jonathan Ong |
|
* MIT Licensed |
|
*/ |
|
|
|
'use strict' |
|
|
|
/** |
|
* Module exports. |
|
* @public |
|
*/ |
|
|
|
module.exports = first |
|
|
|
/** |
|
* Get the first event in a set of event emitters and event pairs. |
|
* |
|
* @param {array} stuff |
|
* @param {function} done |
|
* @public |
|
*/ |
|
|
|
function first(stuff, done) { |
|
if (!Array.isArray(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) |
|
throw new TypeError('each array member must be [ee, events...]') |
|
|
|
var ee = arr[0] |
|
|
|
for (var j = 1; j < arr.length; j++) { |
|
var event = arr[j] |
|
var fn = listener(event, callback) |
|
|
|
// listen to the event |
|
ee.on(event, fn) |
|
// push this listener to the list of cleanups |
|
cleanups.push({ |
|
ee: ee, |
|
event: event, |
|
fn: fn, |
|
}) |
|
} |
|
} |
|
|
|
function callback() { |
|
cleanup() |
|
done.apply(null, arguments) |
|
} |
|
|
|
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 |
|
} |
|
|
|
/** |
|
* Create the event listener. |
|
* @private |
|
*/ |
|
|
|
function listener(event, done) { |
|
return function onevent(arg1) { |
|
var args = new Array(arguments.length) |
|
var ee = this |
|
var err = event === 'error' |
|
? arg1 |
|
: null |
|
|
|
// copy args to prevent arguments escaping scope |
|
for (var i = 0; i < args.length; i++) { |
|
args[i] = arguments[i] |
|
} |
|
|
|
done(err, ee, event, args) |
|
} |
|
}
|
|
|