You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							166 lines
						
					
					
						
							7.9 KiB
						
					
					
				
			
		
		
	
	
							166 lines
						
					
					
						
							7.9 KiB
						
					
					
				"use strict";
 | 
						|
module.exports =
 | 
						|
function(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async) {
 | 
						|
var util = require("./util");
 | 
						|
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 promiseSetter = function(i) {
 | 
						|
        return new Function("promise", "holder", "                           \n\
 | 
						|
            'use strict';                                                    \n\
 | 
						|
            holder.pIndex = promise;                                         \n\
 | 
						|
            ".replace(/Index/g, i));
 | 
						|
    };
 | 
						|
 | 
						|
    var generateHolderClass = function(total) {
 | 
						|
        var props = new Array(total);
 | 
						|
        for (var i = 0; i < props.length; ++i) {
 | 
						|
            props[i] = "this.p" + (i+1);
 | 
						|
        }
 | 
						|
        var assignment = props.join(" = ") + " = null;";
 | 
						|
        var cancellationCode= "var promise;\n" + props.map(function(prop) {
 | 
						|
            return "                                                         \n\
 | 
						|
                promise = " + prop + ";                                      \n\
 | 
						|
                if (promise instanceof Promise) {                            \n\
 | 
						|
                    promise.cancel();                                        \n\
 | 
						|
                }                                                            \n\
 | 
						|
            ";
 | 
						|
        }).join("\n");
 | 
						|
        var passedArguments = props.join(", ");
 | 
						|
        var name = "Holder$" + total;
 | 
						|
 | 
						|
 | 
						|
        var code = "return function(tryCatch, errorObj, Promise, async) {    \n\
 | 
						|
            'use strict';                                                    \n\
 | 
						|
            function [TheName](fn) {                                         \n\
 | 
						|
                [TheProperties]                                              \n\
 | 
						|
                this.fn = fn;                                                \n\
 | 
						|
                this.asyncNeeded = true;                                     \n\
 | 
						|
                this.now = 0;                                                \n\
 | 
						|
            }                                                                \n\
 | 
						|
                                                                             \n\
 | 
						|
            [TheName].prototype._callFunction = function(promise) {          \n\
 | 
						|
                promise._pushContext();                                      \n\
 | 
						|
                var ret = tryCatch(this.fn)([ThePassedArguments]);           \n\
 | 
						|
                promise._popContext();                                       \n\
 | 
						|
                if (ret === errorObj) {                                      \n\
 | 
						|
                    promise._rejectCallback(ret.e, false);                   \n\
 | 
						|
                } else {                                                     \n\
 | 
						|
                    promise._resolveCallback(ret);                           \n\
 | 
						|
                }                                                            \n\
 | 
						|
            };                                                               \n\
 | 
						|
                                                                             \n\
 | 
						|
            [TheName].prototype.checkFulfillment = function(promise) {       \n\
 | 
						|
                var now = ++this.now;                                        \n\
 | 
						|
                if (now === [TheTotal]) {                                    \n\
 | 
						|
                    if (this.asyncNeeded) {                                  \n\
 | 
						|
                        async.invoke(this._callFunction, this, promise);     \n\
 | 
						|
                    } else {                                                 \n\
 | 
						|
                        this._callFunction(promise);                         \n\
 | 
						|
                    }                                                        \n\
 | 
						|
                                                                             \n\
 | 
						|
                }                                                            \n\
 | 
						|
            };                                                               \n\
 | 
						|
                                                                             \n\
 | 
						|
            [TheName].prototype._resultCancelled = function() {              \n\
 | 
						|
                [CancellationCode]                                           \n\
 | 
						|
            };                                                               \n\
 | 
						|
                                                                             \n\
 | 
						|
            return [TheName];                                                \n\
 | 
						|
        }(tryCatch, errorObj, Promise, async);                               \n\
 | 
						|
        ";
 | 
						|
 | 
						|
        code = code.replace(/\[TheName\]/g, name)
 | 
						|
            .replace(/\[TheTotal\]/g, total)
 | 
						|
            .replace(/\[ThePassedArguments\]/g, passedArguments)
 | 
						|
            .replace(/\[TheProperties\]/g, assignment)
 | 
						|
            .replace(/\[CancellationCode\]/g, cancellationCode);
 | 
						|
 | 
						|
        return new Function("tryCatch", "errorObj", "Promise", "async", code)
 | 
						|
                           (tryCatch, errorObj, Promise, async);
 | 
						|
    };
 | 
						|
 | 
						|
    var holderClasses = [];
 | 
						|
    var thenCallbacks = [];
 | 
						|
    var promiseSetters = [];
 | 
						|
 | 
						|
    for (var i = 0; i < 8; ++i) {
 | 
						|
        holderClasses.push(generateHolderClass(i + 1));
 | 
						|
        thenCallbacks.push(thenCallback(i + 1));
 | 
						|
        promiseSetters.push(promiseSetter(i + 1));
 | 
						|
    }
 | 
						|
 | 
						|
    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 <= 8 && canEvaluate) {
 | 
						|
                var ret = new Promise(INTERNAL);
 | 
						|
                ret._captureStackTrace();
 | 
						|
                var HolderClass = holderClasses[last - 1];
 | 
						|
                var holder = new HolderClass(fn);
 | 
						|
                var callbacks = thenCallbacks;
 | 
						|
 | 
						|
                for (var i = 0; i < last; ++i) {
 | 
						|
                    var maybePromise = tryConvertToPromise(arguments[i], ret);
 | 
						|
                    if (maybePromise instanceof Promise) {
 | 
						|
                        maybePromise = maybePromise._target();
 | 
						|
                        var bitField = maybePromise._bitField;
 | 
						|
                        ;
 | 
						|
                        if (((bitField & 50397184) === 0)) {
 | 
						|
                            maybePromise._then(callbacks[i], reject,
 | 
						|
                                               undefined, ret, holder);
 | 
						|
                            promiseSetters[i](maybePromise, holder);
 | 
						|
                            holder.asyncNeeded = false;
 | 
						|
                        } else if (((bitField & 33554432) !== 0)) {
 | 
						|
                            callbacks[i].call(ret,
 | 
						|
                                              maybePromise._value(), holder);
 | 
						|
                        } else if (((bitField & 16777216) !== 0)) {
 | 
						|
                            ret._reject(maybePromise._reason());
 | 
						|
                        } else {
 | 
						|
                            ret._cancel();
 | 
						|
                        }
 | 
						|
                    } else {
 | 
						|
                        callbacks[i].call(ret, maybePromise, holder);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                if (!ret._isFateSealed()) {
 | 
						|
                    if (holder.asyncNeeded) {
 | 
						|
                        var context = Promise._getContext();
 | 
						|
                        holder.fn = util.contextBind(context, holder.fn);
 | 
						|
                    }
 | 
						|
                    ret._setAsyncGuaranteed();
 | 
						|
                    ret._setOnCancel(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;
 | 
						|
};
 | 
						|
 | 
						|
};
 |