Skip to content

Instantly share code, notes, and snippets.

@mutongwu
Last active July 17, 2019 06:47
Show Gist options
  • Save mutongwu/bc9ddf76d3b7ceb2a30748456b434819 to your computer and use it in GitHub Desktop.
Save mutongwu/bc9ddf76d3b7ceb2a30748456b434819 to your computer and use it in GitHub Desktop.
promise_finally

promise的finally 方法,有几点注意:

  • resolve/reject都会被调用;
  • 函数没有入参,因为它不管状态;
  • 函数的返回值,除了返回一个Promise.reject 对象,不影响后续 then 的传值。
  • 返回 Promise.reject(),将改变后续then方法的执行,进入到 rejected 方法里面
// output: res 2
Promise.resolve(2).finally(() => {return Promise.resolve(11)}).then(res => console.log('res',res), err => console.log('err',err))
Promise.resolve(2).finally(() => {return 11}).then(res => console.log('res',res), err => console.log('err',err))
Promise.resolve(2).finally(() => {Promise.reject(11)}).then(res => console.log('res',res), err => console.log('err',err))

// output: err 2
Promise.reject(2).finally(() => {return Promise.resolve(11)}).then(res => console.log('res',res), err => console.log('err',err))
Promise.reject(2).finally(() => {return 11}).then(res => console.log('res',res), err => console.log('err',err))
Promise.reject(2).finally(() => {Promise.reject(11)}).then(res => console.log('res',res), err => console.log('err',err))

// change chain, return the rejected value 11
Promise.resolve(2).finally(() => {return Promise.reject(11)}).then(res => console.log('res',res), err => console.log('err',err))
// err 11

Promise.reject(3).finally(() => {return Promise.reject(11)}).then(res => console.log('res',res), err => console.log('err',err))
//err 11

@mutongwu
Copy link
Author

Promise.prototype.finally = function (callback) {
    const P = this.constructor;
    // We don’t invoke the callback in here,
    // because we want then() to handle its exceptions
    return this.then(
        // Callback fulfills => continue with receiver’s fulfillment or rejection
        // Callback rejects => pass on that rejection (then() has no 2nd parameter!)
        value  => P.resolve(callback()).then(() => value),
        reason => P.resolve(callback()).then(() => { throw reason })
    );
};

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment