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
			| 
											3 years ago
										 | "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; | ||
|  | }; | ||
|  | 
 | ||
|  | }; |