finally其实也是一个 then,不管成功或失败都会调用

    finally实现原理

    1. Promise.prototype.finally = function(callback) {
    2. return this.then(val => {
    3. // 如果callback是个 promise,要等待 传入的promise执行后,再返回结果
    4. return Promise.resolve(callback().then(() => val))
    5. // callback();
    6. // return val; // 如果上一个 then成功,就将这个成功态向下传递
    7. }, err => {
    8. return Promise.resole(callback().then(() => throw err))
    9. // callback();
    10. // throw err; // 如果上一个 then是失败态,就将这个失败向下传递
    11. })
    12. }

    usage

    1. Promise.reject()
    2. .finally(() => {
    3. return new Promise((resolve, reject) => {
    4. setTimeout(() => resolve() , 1000)
    5. })
    6. })
    7. .catch(err => err)