Add Promise finally method to polyfill

This commit is contained in:
spacejack 2018-02-18 20:18:13 -05:00
parent 1410e35456
commit f99b804f5b
2 changed files with 43 additions and 2 deletions

View file

@ -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

View file

@ -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) {