Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
81160 views
1
"use strict";
2
module.exports =
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;
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 caller = function(count) {
21
var values = [];
22
for (var i = 1; i <= count; ++i) values.push("holder.p" + i);
23
return new Function("holder", " \n\
24
'use strict'; \n\
25
var callback = holder.fn; \n\
26
return callback(values); \n\
27
".replace(/values/g, values.join(", ")));
28
};
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));
34
}
35
36
var Holder = function(total, fn) {
37
this.p1 = this.p2 = this.p3 = this.p4 = this.p5 = null;
38
this.fn = fn;
39
this.total = total;
40
this.now = 0;
41
};
42
43
Holder.prototype.callers = callers;
44
Holder.prototype.checkFulfillment = function(promise) {
45
var now = this.now;
46
now++;
47
var total = this.total;
48
if (now >= 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);
55
} else {
56
promise._resolveCallback(ret);
57
}
58
} else {
59
this.now = now;
60
}
61
};
62
63
var reject = function (reason) {
64
this._reject(reason);
65
};
66
}
67
}
68
69
Promise.join = function () {
70
var last = arguments.length - 1;
71
var fn;
72
if (last > 0 && typeof arguments[last] === "function") {
73
fn = arguments[last];
74
if (!false) {
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);
90
} else {
91
ret._reject(maybePromise._reason());
92
}
93
} else {
94
callbacks[i].call(ret, maybePromise, holder);
95
}
96
}
97
return ret;
98
}
99
}
100
}
101
var $_len = arguments.length;var args = new Array($_len); for(var $_i = 0; $_i < $_len; ++$_i) {args[$_i] = arguments[$_i];}
102
if (fn) args.pop();
103
var ret = new PromiseArray(args).promise();
104
return fn !== undefined ? ret.spread(fn) : ret;
105
};
106
107
};
108
109