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.
49 lines
1.2 KiB
49 lines
1.2 KiB
"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); |
|
}; |
|
|
|
};
|
|
|