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;
12 var thenCallback = function(i) {
13 return new Function("value", "holder", " \n\
15 holder.pIndex = value; \n\
16 holder.checkFulfillment(this); \n\
17 ".replace(/Index/g, i));
20 var caller = function(count) {
22 for (var i = 1; i <= count; ++i) values.push("holder.p" + i);
23 return new Function("holder", " \n\
25 var callback = holder.fn; \n\
26 return callback(values); \n\
27 ".replace(/values/g, values.join(", ")));
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));
36 var Holder = function(total, fn) {
37 this.p1 = this.p2 = this.p3 = this.p4 = this.p5 = null;
43 Holder.prototype.callers = callers;
44 Holder.prototype.checkFulfillment = function(promise) {
47 var total = this.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);
56 promise._resolveCallback(ret);
63 var reject = function (reason) {
69 Promise.join = function () {
70 var last = arguments.length - 1;
72 if (last > 0 && typeof arguments[last] === "function") {
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);
91 ret._reject(maybePromise._reason());
94 callbacks[i].call(ret, maybePromise, holder);
101 var $_len = arguments.length;var args = new Array($_len); for(var $_i = 0; $_i < $_len; ++$_i) {args[$_i] = arguments[$_i];}
103 var ret = new PromiseArray(args).promise();
104 return fn !== undefined ? ret.spread(fn) : ret;