30e7bb094ea664a5c018fcca4b70a0ee29f968f9
[aai/esr-gui.git] /
1 "use strict";
2 module.exports = function(
3     Promise, INTERNAL, tryConvertToPromise, apiRejection) {
4 var isArray = require("./util.js").isArray;
5
6 var raceLater = function (promise) {
7     return promise.then(function(array) {
8         return race(array, promise);
9     });
10 };
11
12 function race(promises, parent) {
13     var maybePromise = tryConvertToPromise(promises);
14
15     if (maybePromise instanceof Promise) {
16         return raceLater(maybePromise);
17     } else if (!isArray(promises)) {
18         return apiRejection("expecting an array, a promise or a thenable\u000a\u000a    See http://goo.gl/s8MMhc\u000a");
19     }
20
21     var ret = new Promise(INTERNAL);
22     if (parent !== undefined) {
23         ret._propagateFrom(parent, 4 | 1);
24     }
25     var fulfill = ret._fulfill;
26     var reject = ret._reject;
27     for (var i = 0, len = promises.length; i < len; ++i) {
28         var val = promises[i];
29
30         if (val === undefined && !(i in promises)) {
31             continue;
32         }
33
34         Promise.cast(val)._then(fulfill, reject, undefined, ret, null);
35     }
36     return ret;
37 }
38
39 Promise.race = function (promises) {
40     return race(promises, undefined);
41 };
42
43 Promise.prototype.race = function () {
44     return race(this, undefined);
45 };
46
47 };