2 module.exports = function(Promise, NEXT_FILTER, tryConvertToPromise) {
3 var util = require("./util.js");
4 var isPrimitive = util.isPrimitive;
5 var thrower = util.thrower;
7 function returnThis() {
10 function throwThis() {
23 function promisedFinally(ret, reasonOrValue, isFulfilled) {
25 if (isPrimitive(reasonOrValue)) {
26 then = isFulfilled ? return$(reasonOrValue) : throw$(reasonOrValue);
28 then = isFulfilled ? returnThis : throwThis;
30 return ret._then(then, thrower, undefined, reasonOrValue, undefined);
33 function finallyHandler(reasonOrValue) {
34 var promise = this.promise;
35 var handler = this.handler;
37 var ret = promise._isBound()
38 ? handler.call(promise._boundValue())
41 if (ret !== undefined) {
42 var maybePromise = tryConvertToPromise(ret, promise);
43 if (maybePromise instanceof Promise) {
44 maybePromise = maybePromise._target();
45 return promisedFinally(maybePromise, reasonOrValue,
46 promise.isFulfilled());
50 if (promise.isRejected()) {
51 NEXT_FILTER.e = reasonOrValue;
58 function tapHandler(value) {
59 var promise = this.promise;
60 var handler = this.handler;
62 var ret = promise._isBound()
63 ? handler.call(promise._boundValue(), value)
66 if (ret !== undefined) {
67 var maybePromise = tryConvertToPromise(ret, promise);
68 if (maybePromise instanceof Promise) {
69 maybePromise = maybePromise._target();
70 return promisedFinally(maybePromise, value, true);
76 Promise.prototype._passThroughHandler = function (handler, isFinally) {
77 if (typeof handler !== "function") return this.then();
79 var promiseAndHandler = {
85 isFinally ? finallyHandler : tapHandler,
86 isFinally ? finallyHandler : undefined, undefined,
87 promiseAndHandler, undefined);
90 Promise.prototype.lastly =
91 Promise.prototype["finally"] = function (handler) {
92 return this._passThroughHandler(handler, true);
95 Promise.prototype.tap = function (handler) {
96 return this._passThroughHandler(handler, false);