手写原理 | Promise.finally

Promise.finally()返回一个Promise实例,在promise结束时,无论结果是fulfilled还是rejected,都会执行指定的回调函数

应用场景:无论Promise是成功还是失败都会执行,避免了在then和catch各写一次的情况

finally和then(onFinally, onFinally)类似,不同之处在于:

  • 调用内联函数时,不需要多次声明该函数或为该函数创建一个变量保存它
  • 由于无法知道 promise 的最终状态,所以 finally 的回调函数中不接收任何参数,它仅用于无论最终结果如何都要执行的情况
  • Promise.resolve(2).then(() => {}, () => {})(resolved 的结果为undefined[因为这里的then没有显式的返回语句,所以结果为undefined])不同,Promise.resolve(2).finally(() => {}) resolved 的结果为 2
  • 同样,Promise.reject(3).then(() => {}, () => {}) (fulfilled 的结果为undefined[因为这里的then没有显式的返回语句,所以结果为undefined]), Promise.reject(3).finally(() => {}) rejected 的结果为 3
1
2
3
4
5
6
7
8
9
10
11
function myPromiseFinally(callback) {
return this.then(function(value) {
return Promise.resolve(callback()).then(function() {
return value;
})
}, function(err) {
return Promise.reject(callback()).then(function() {
throw err;
})
})
}