b3ec246fa841343bc9864576d3cf4c6f99763c5e
[yaffs-website] / node_modules / bluebird / js / release / join.js
1 "use strict";
2 module.exports =
3 function(Promise, PromiseArray, tryConvertToPromise, INTERNAL) {
4 var util = require("./util");
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 promiseSetter = function(i) {
21         return new Function("promise", "holder", "                           \n\
22             'use strict';                                                    \n\
23             holder.pIndex = promise;                                         \n\
24             ".replace(/Index/g, i));
25     };
26
27     var generateHolderClass = function(total) {
28         var props = new Array(total);
29         for (var i = 0; i < props.length; ++i) {
30             props[i] = "this.p" + (i+1);
31         }
32         var assignment = props.join(" = ") + " = null;";
33         var cancellationCode= "var promise;\n" + props.map(function(prop) {
34             return "                                                         \n\
35                 promise = " + prop + ";                                      \n\
36                 if (promise instanceof Promise) {                            \n\
37                     promise.cancel();                                        \n\
38                 }                                                            \n\
39             ";
40         }).join("\n");
41         var passedArguments = props.join(", ");
42         var name = "Holder$" + total;
43
44
45         var code = "return function(tryCatch, errorObj, Promise) {           \n\
46             'use strict';                                                    \n\
47             function [TheName](fn) {                                         \n\
48                 [TheProperties]                                              \n\
49                 this.fn = fn;                                                \n\
50                 this.now = 0;                                                \n\
51             }                                                                \n\
52             [TheName].prototype.checkFulfillment = function(promise) {       \n\
53                 var now = ++this.now;                                        \n\
54                 if (now === [TheTotal]) {                                    \n\
55                     promise._pushContext();                                  \n\
56                     var callback = this.fn;                                  \n\
57                     var ret = tryCatch(callback)([ThePassedArguments]);      \n\
58                     promise._popContext();                                   \n\
59                     if (ret === errorObj) {                                  \n\
60                         promise._rejectCallback(ret.e, false);               \n\
61                     } else {                                                 \n\
62                         promise._resolveCallback(ret);                       \n\
63                     }                                                        \n\
64                 }                                                            \n\
65             };                                                               \n\
66                                                                              \n\
67             [TheName].prototype._resultCancelled = function() {              \n\
68                 [CancellationCode]                                           \n\
69             };                                                               \n\
70                                                                              \n\
71             return [TheName];                                                \n\
72         }(tryCatch, errorObj, Promise);                                      \n\
73         ";
74
75         code = code.replace(/\[TheName\]/g, name)
76             .replace(/\[TheTotal\]/g, total)
77             .replace(/\[ThePassedArguments\]/g, passedArguments)
78             .replace(/\[TheProperties\]/g, assignment)
79             .replace(/\[CancellationCode\]/g, cancellationCode);
80
81         return new Function("tryCatch", "errorObj", "Promise", code)
82                            (tryCatch, errorObj, Promise);
83     };
84
85     var holderClasses = [];
86     var thenCallbacks = [];
87     var promiseSetters = [];
88
89     for (var i = 0; i < 8; ++i) {
90         holderClasses.push(generateHolderClass(i + 1));
91         thenCallbacks.push(thenCallback(i + 1));
92         promiseSetters.push(promiseSetter(i + 1));
93     }
94
95     reject = function (reason) {
96         this._reject(reason);
97     };
98 }}
99
100 Promise.join = function () {
101     var last = arguments.length - 1;
102     var fn;
103     if (last > 0 && typeof arguments[last] === "function") {
104         fn = arguments[last];
105         if (!false) {
106             if (last <= 8 && canEvaluate) {
107                 var ret = new Promise(INTERNAL);
108                 ret._captureStackTrace();
109                 var HolderClass = holderClasses[last - 1];
110                 var holder = new HolderClass(fn);
111                 var callbacks = thenCallbacks;
112
113                 for (var i = 0; i < last; ++i) {
114                     var maybePromise = tryConvertToPromise(arguments[i], ret);
115                     if (maybePromise instanceof Promise) {
116                         maybePromise = maybePromise._target();
117                         var bitField = maybePromise._bitField;
118                         ;
119                         if (((bitField & 50397184) === 0)) {
120                             maybePromise._then(callbacks[i], reject,
121                                                undefined, ret, holder);
122                             promiseSetters[i](maybePromise, holder);
123                         } else if (((bitField & 33554432) !== 0)) {
124                             callbacks[i].call(ret,
125                                               maybePromise._value(), holder);
126                         } else if (((bitField & 16777216) !== 0)) {
127                             ret._reject(maybePromise._reason());
128                         } else {
129                             ret._cancel();
130                         }
131                     } else {
132                         callbacks[i].call(ret, maybePromise, holder);
133                     }
134                 }
135                 if (!ret._isFateSealed()) {
136                     ret._setAsyncGuaranteed();
137                     ret._setOnCancel(holder);
138                 }
139                 return ret;
140             }
141         }
142     }
143     var $_len = arguments.length;var args = new Array($_len); for(var $_i = 0; $_i < $_len; ++$_i) {args[$_i] = arguments[$_i];};
144     if (fn) args.pop();
145     var ret = new PromiseArray(args).promise();
146     return fn !== undefined ? ret.spread(fn) : ret;
147 };
148
149 };