| "use strict"; |
| module.exports = function( |
| Promise, INTERNAL, tryConvertToPromise, apiRejection) { |
| var isArray = require("./util.js").isArray; |
| |
| 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 if (!isArray(promises)) { |
| return apiRejection("expecting an array, a promise or a thenable\u000a\u000a See http://goo.gl/s8MMhc\u000a"); |
| } |
| |
| var ret = new Promise(INTERNAL); |
| if (parent !== undefined) { |
| ret._propagateFrom(parent, 4 | 1); |
| } |
| 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); |
| }; |
| |
| }; |