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.
		
		
		
		
		
			
		
			
				
					96 lines
				
				1.6 KiB
			
		
		
			
		
	
	
					96 lines
				
				1.6 KiB
			| 
											3 years ago
										 | /*! | ||
|  |  * 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) | ||
|  |   } | ||
|  | } |