From f99b804f5b3c2c9f82eb666b093ded1dbfd9da88 Mon Sep 17 00:00:00 2001 From: spacejack Date: Sun, 18 Feb 2018 20:18:13 -0500 Subject: [PATCH] Add Promise finally method to polyfill --- promise/promise.js | 26 ++++++++++++++++++++++++-- promise/tests/test-promise.js | 19 +++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/promise/promise.js b/promise/promise.js index 53aefecc..51d124e8 100644 --- a/promise/promise.js +++ b/promise/promise.js @@ -61,6 +61,20 @@ PromisePolyfill.prototype.then = function(onFulfilled, onRejection) { PromisePolyfill.prototype.catch = function(onRejection) { return this.then(null, onRejection) } +PromisePolyfill.prototype.finally = function(callback) { + return this.then( + function(value) { + return PromisePolyfill.resolve(callback()).then(function() { + return value + }) + }, + function(reason) { + return PromisePolyfill.resolve(callback()).then(function() { + return PromisePolyfill.reject(reason); + }) + } + ) +} PromisePolyfill.resolve = function(value) { if (value instanceof PromisePolyfill) return value return new PromisePolyfill(function(resolve) {resolve(value)}) @@ -96,10 +110,18 @@ PromisePolyfill.race = function(list) { } if (typeof window !== "undefined") { - if (typeof window.Promise === "undefined") window.Promise = PromisePolyfill + if (typeof window.Promise === "undefined") { + window.Promise = PromisePolyfill + } else if (!window.Promise.prototype.finally) { + window.Promise.prototype.finally = PromisePolyfill.prototype.finally + } module.exports = window.Promise } else if (typeof global !== "undefined") { - if (typeof global.Promise === "undefined") global.Promise = PromisePolyfill + if (typeof global.Promise === "undefined") { + global.Promise = PromisePolyfill + } else if (!global.Promise.prototype.finally) { + global.Promise.prototype.finally = PromisePolyfill.prototype.finally + } module.exports = global.Promise } else { module.exports = PromisePolyfill diff --git a/promise/tests/test-promise.js b/promise/tests/test-promise.js index e368165c..7798293f 100644 --- a/promise/tests/test-promise.js +++ b/promise/tests/test-promise.js @@ -15,6 +15,7 @@ o.spec("promise", function() { o("constructor has correct methods", function() { o(typeof Promise.prototype.then).equals("function") o(typeof Promise.prototype.catch).equals("function") + o(typeof Promise.prototype.finally).equals("function") o(typeof Promise.resolve).equals("function") o(typeof Promise.reject).equals("function") o(typeof Promise.race).equals("function") @@ -53,6 +54,24 @@ o.spec("promise", function() { o(value).equals(1) }).then(done) }) + o("finally after then returns promise", function(done) { + var promise = Promise.resolve(1) + + promise.then(function(value) { + o(value).equals(1) + }).finally(function(value) { + o(value).equals(undefined) + }).then(done) + }) + o("finally after catch returns promise", function(done) { + var promise = Promise.reject(1) + + promise.catch(function(value) { + o(value).equals(1) + }).finally(function(value) { + o(value).equals(undefined) + }).then(done) + }) }) o.spec("resolve", function() { o("resolves once", function(done) {