| "use strict"; |
| module.exports = |
| function(Promise, PromiseArray, tryConvertToPromise, INTERNAL) { |
| var util = require("./util.js"); |
| var canEvaluate = util.canEvaluate; |
| var tryCatch = util.tryCatch; |
| var errorObj = util.errorObj; |
| var reject; |
| |
| if (!false) { |
| if (canEvaluate) { |
| var thenCallback = function(i) { |
| return new Function("value", "holder", " \n\ |
| 'use strict'; \n\ |
| holder.pIndex = value; \n\ |
| holder.checkFulfillment(this); \n\ |
| ".replace(/Index/g, i)); |
| }; |
| |
| var caller = function(count) { |
| var values = []; |
| for (var i = 1; i <= count; ++i) values.push("holder.p" + i); |
| return new Function("holder", " \n\ |
| 'use strict'; \n\ |
| var callback = holder.fn; \n\ |
| return callback(values); \n\ |
| ".replace(/values/g, values.join(", "))); |
| }; |
| var thenCallbacks = []; |
| var callers = [undefined]; |
| for (var i = 1; i <= 5; ++i) { |
| thenCallbacks.push(thenCallback(i)); |
| callers.push(caller(i)); |
| } |
| |
| var Holder = function(total, fn) { |
| this.p1 = this.p2 = this.p3 = this.p4 = this.p5 = null; |
| this.fn = fn; |
| this.total = total; |
| this.now = 0; |
| }; |
| |
| Holder.prototype.callers = callers; |
| Holder.prototype.checkFulfillment = function(promise) { |
| var now = this.now; |
| now++; |
| var total = this.total; |
| if (now >= total) { |
| var handler = this.callers[total]; |
| promise._pushContext(); |
| var ret = tryCatch(handler)(this); |
| promise._popContext(); |
| if (ret === errorObj) { |
| promise._rejectCallback(ret.e, false, true); |
| } else { |
| promise._resolveCallback(ret); |
| } |
| } else { |
| this.now = now; |
| } |
| }; |
| |
| var reject = function (reason) { |
| this._reject(reason); |
| }; |
| } |
| } |
| |
| Promise.join = function () { |
| var last = arguments.length - 1; |
| var fn; |
| if (last > 0 && typeof arguments[last] === "function") { |
| fn = arguments[last]; |
| if (!false) { |
| if (last < 6 && canEvaluate) { |
| var ret = new Promise(INTERNAL); |
| ret._captureStackTrace(); |
| var holder = new Holder(last, fn); |
| var callbacks = thenCallbacks; |
| for (var i = 0; i < last; ++i) { |
| var maybePromise = tryConvertToPromise(arguments[i], ret); |
| if (maybePromise instanceof Promise) { |
| maybePromise = maybePromise._target(); |
| if (maybePromise._isPending()) { |
| maybePromise._then(callbacks[i], reject, |
| undefined, ret, holder); |
| } else if (maybePromise._isFulfilled()) { |
| callbacks[i].call(ret, |
| maybePromise._value(), holder); |
| } else { |
| ret._reject(maybePromise._reason()); |
| } |
| } else { |
| callbacks[i].call(ret, maybePromise, holder); |
| } |
| } |
| return ret; |
| } |
| } |
| } |
| var $_len = arguments.length;var args = new Array($_len); for(var $_i = 0; $_i < $_len; ++$_i) {args[$_i] = arguments[$_i];} |
| if (fn) args.pop(); |
| var ret = new PromiseArray(args).promise(); |
| return fn !== undefined ? ret.spread(fn) : ret; |
| }; |
| |
| }; |