Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
81160 views
1
"use strict";
2
module.exports = function(Promise, NEXT_FILTER, tryConvertToPromise) {
3
var util = require("./util.js");
4
var wrapsPrimitiveReceiver = util.wrapsPrimitiveReceiver;
5
var isPrimitive = util.isPrimitive;
6
var thrower = util.thrower;
7
8
function returnThis() {
9
return this;
10
}
11
function throwThis() {
12
throw this;
13
}
14
function return$(r) {
15
return function() {
16
return r;
17
};
18
}
19
function throw$(r) {
20
return function() {
21
throw r;
22
};
23
}
24
function promisedFinally(ret, reasonOrValue, isFulfilled) {
25
var then;
26
if (wrapsPrimitiveReceiver && isPrimitive(reasonOrValue)) {
27
then = isFulfilled ? return$(reasonOrValue) : throw$(reasonOrValue);
28
} else {
29
then = isFulfilled ? returnThis : throwThis;
30
}
31
return ret._then(then, thrower, undefined, reasonOrValue, undefined);
32
}
33
34
function finallyHandler(reasonOrValue) {
35
var promise = this.promise;
36
var handler = this.handler;
37
38
var ret = promise._isBound()
39
? handler.call(promise._boundTo)
40
: handler();
41
42
if (ret !== undefined) {
43
var maybePromise = tryConvertToPromise(ret, promise);
44
if (maybePromise instanceof Promise) {
45
maybePromise = maybePromise._target();
46
return promisedFinally(maybePromise, reasonOrValue,
47
promise.isFulfilled());
48
}
49
}
50
51
if (promise.isRejected()) {
52
NEXT_FILTER.e = reasonOrValue;
53
return NEXT_FILTER;
54
} else {
55
return reasonOrValue;
56
}
57
}
58
59
function tapHandler(value) {
60
var promise = this.promise;
61
var handler = this.handler;
62
63
var ret = promise._isBound()
64
? handler.call(promise._boundTo, value)
65
: handler(value);
66
67
if (ret !== undefined) {
68
var maybePromise = tryConvertToPromise(ret, promise);
69
if (maybePromise instanceof Promise) {
70
maybePromise = maybePromise._target();
71
return promisedFinally(maybePromise, value, true);
72
}
73
}
74
return value;
75
}
76
77
Promise.prototype._passThroughHandler = function (handler, isFinally) {
78
if (typeof handler !== "function") return this.then();
79
80
var promiseAndHandler = {
81
promise: this,
82
handler: handler
83
};
84
85
return this._then(
86
isFinally ? finallyHandler : tapHandler,
87
isFinally ? finallyHandler : undefined, undefined,
88
promiseAndHandler, undefined);
89
};
90
91
Promise.prototype.lastly =
92
Promise.prototype["finally"] = function (handler) {
93
return this._passThroughHandler(handler, true);
94
};
95
96
Promise.prototype.tap = function (handler) {
97
return this._passThroughHandler(handler, false);
98
};
99
};
100
101