cf33eb1d073b48a2b5d4204cc44e150dc504bc83
[aai/esr-gui.git] /
1 "use strict";
2 module.exports =
3 function(Promise, PromiseArray, tryConvertToPromise, INTERNAL) {
4 var util = require("./util.js");
5 var canEvaluate = util.canEvaluate;
6 var tryCatch = util.tryCatch;
7 var errorObj = util.errorObj;
8 var reject;
9
10 if (!false) {
11 if (canEvaluate) {
12     var thenCallback = function(i) {
13         return new Function("value", "holder", "                             \n\
14             'use strict';                                                    \n\
15             holder.pIndex = value;                                           \n\
16             holder.checkFulfillment(this);                                   \n\
17             ".replace(/Index/g, i));
18     };
19
20     var caller = function(count) {
21         var values = [];
22         for (var i = 1; i <= count; ++i) values.push("holder.p" + i);
23         return new Function("holder", "                                      \n\
24             'use strict';                                                    \n\
25             var callback = holder.fn;                                        \n\
26             return callback(values);                                         \n\
27             ".replace(/values/g, values.join(", ")));
28     };
29     var thenCallbacks = [];
30     var callers = [undefined];
31     for (var i = 1; i <= 5; ++i) {
32         thenCallbacks.push(thenCallback(i));
33         callers.push(caller(i));
34     }
35
36     var Holder = function(total, fn) {
37         this.p1 = this.p2 = this.p3 = this.p4 = this.p5 = null;
38         this.fn = fn;
39         this.total = total;
40         this.now = 0;
41     };
42
43     Holder.prototype.callers = callers;
44     Holder.prototype.checkFulfillment = function(promise) {
45         var now = this.now;
46         now++;
47         var total = this.total;
48         if (now >= total) {
49             var handler = this.callers[total];
50             promise._pushContext();
51             var ret = tryCatch(handler)(this);
52             promise._popContext();
53             if (ret === errorObj) {
54                 promise._rejectCallback(ret.e, false, true);
55             } else {
56                 promise._resolveCallback(ret);
57             }
58         } else {
59             this.now = now;
60         }
61     };
62
63     var reject = function (reason) {
64         this._reject(reason);
65     };
66 }
67 }
68
69 Promise.join = function () {
70     var last = arguments.length - 1;
71     var fn;
72     if (last > 0 && typeof arguments[last] === "function") {
73         fn = arguments[last];
74         if (!false) {
75             if (last < 6 && canEvaluate) {
76                 var ret = new Promise(INTERNAL);
77                 ret._captureStackTrace();
78                 var holder = new Holder(last, fn);
79                 var callbacks = thenCallbacks;
80                 for (var i = 0; i < last; ++i) {
81                     var maybePromise = tryConvertToPromise(arguments[i], ret);
82                     if (maybePromise instanceof Promise) {
83                         maybePromise = maybePromise._target();
84                         if (maybePromise._isPending()) {
85                             maybePromise._then(callbacks[i], reject,
86                                                undefined, ret, holder);
87                         } else if (maybePromise._isFulfilled()) {
88                             callbacks[i].call(ret,
89                                               maybePromise._value(), holder);
90                         } else {
91                             ret._reject(maybePromise._reason());
92                         }
93                     } else {
94                         callbacks[i].call(ret, maybePromise, holder);
95                     }
96                 }
97                 return ret;
98             }
99         }
100     }
101     var $_len = arguments.length;var args = new Array($_len); for(var $_i = 0; $_i < $_len; ++$_i) {args[$_i] = arguments[$_i];}
102     if (fn) args.pop();
103     var ret = new PromiseArray(args).promise();
104     return fn !== undefined ? ret.spread(fn) : ret;
105 };
106
107 };