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.
		
		
		
		
		
			
		
			
				
					50 lines
				
				1.2 KiB
			
		
		
			
		
	
	
					50 lines
				
				1.2 KiB
			| 
											3 years ago
										 | "use strict"; | ||
|  | module.exports = function( | ||
|  |     Promise, INTERNAL, tryConvertToPromise, apiRejection) { | ||
|  | var util = require("./util"); | ||
|  | 
 | ||
|  | var raceLater = function (promise) { | ||
|  |     return promise.then(function(array) { | ||
|  |         return race(array, promise); | ||
|  |     }); | ||
|  | }; | ||
|  | 
 | ||
|  | function race(promises, parent) { | ||
|  |     var maybePromise = tryConvertToPromise(promises); | ||
|  | 
 | ||
|  |     if (maybePromise instanceof Promise) { | ||
|  |         return raceLater(maybePromise); | ||
|  |     } else { | ||
|  |         promises = util.asArray(promises); | ||
|  |         if (promises === null) | ||
|  |             return apiRejection("expecting an array or an iterable object but got " + util.classString(promises)); | ||
|  |     } | ||
|  | 
 | ||
|  |     var ret = new Promise(INTERNAL); | ||
|  |     if (parent !== undefined) { | ||
|  |         ret._propagateFrom(parent, 3); | ||
|  |     } | ||
|  |     var fulfill = ret._fulfill; | ||
|  |     var reject = ret._reject; | ||
|  |     for (var i = 0, len = promises.length; i < len; ++i) { | ||
|  |         var val = promises[i]; | ||
|  | 
 | ||
|  |         if (val === undefined && !(i in promises)) { | ||
|  |             continue; | ||
|  |         } | ||
|  | 
 | ||
|  |         Promise.cast(val)._then(fulfill, reject, undefined, ret, null); | ||
|  |     } | ||
|  |     return ret; | ||
|  | } | ||
|  | 
 | ||
|  | Promise.race = function (promises) { | ||
|  |     return race(promises, undefined); | ||
|  | }; | ||
|  | 
 | ||
|  | Promise.prototype.race = function () { | ||
|  |     return race(this, undefined); | ||
|  | }; | ||
|  | 
 | ||
|  | }; |