Source code

Revision control

Copy as Markdown

Other Tools

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// Promise.prototype.finally proposal, stage 3.
// Promise.prototype.finally ( onFinally )
function Promise_finally(onFinally) {
// Step 1.
var promise = this;
// Step 2.
if (!IsObject(promise)) {
ThrowTypeError(JSMSG_INCOMPATIBLE_PROTO, "Promise", "finally", "value");
}
// Step 3.
var C = SpeciesConstructor(promise, GetBuiltinConstructor("Promise"));
// Step 4.
assert(IsConstructor(C), "SpeciesConstructor returns a constructor function");
// Steps 5-6.
var thenFinally, catchFinally;
if (!IsCallable(onFinally)) {
thenFinally = onFinally;
catchFinally = onFinally;
} else {
// ThenFinally Function.
// The parentheses prevent the infering of a function name.
// prettier-ignore
(thenFinally) = function(value) {
// Steps 1-2 (implicit).
// Step 3.
var result = callContentFunction(onFinally, undefined);
// Steps 4-5 (implicit).
// Step 6.
var promise = PromiseResolve(C, result);
// Step 7.
// FIXME: spec issue - "be equivalent to a function that" is not a defined spec term.
// Step 8.
return callContentFunction(promise.then, promise, function() {
return value;
});
};
// CatchFinally Function.
// prettier-ignore
(catchFinally) = function(reason) {
// Steps 1-2 (implicit).
// Step 3.
var result = callContentFunction(onFinally, undefined);
// Steps 4-5 (implicit).
// Step 6.
var promise = PromiseResolve(C, result);
// Step 7.
// FIXME: spec issue - "be equivalent to a function that" is not a defined spec term.
// Step 8.
return callContentFunction(promise.then, promise, function() {
throw reason;
});
};
}
// Step 7.
return callContentFunction(promise.then, promise, thenFinally, catchFinally);
}