| "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); |
| }; |
| |
| }; |