在原生ES6承诺中,Bluebird Promise.finally的等价物是什么?

2022-08-30 02:29:31

Bluebird提供了一个最终的方法,无论你的承诺链中发生什么,它都被称为。我发现它非常方便用于清洁目的(例如解锁资源,隐藏加载程序等)

在ES6原生承诺中是否有等效的?


答案 1

截至2018年2月7日

Chrome 63+、Firefox 58+和Opera 50+支持Promise.finally

在 Node.js 8.1.4+ (V8 5.8+) 中,该功能位于标志 --harmony-promise-finally 后面。

Promise.prototype.final 最后 ECMAScript 提案目前处于 TC39 流程的第 3 阶段。

同时在所有浏览器中都有承诺.终于功能;您可以在 catch() 之后添加一个额外的 then() 以始终调用该回调

例:

myES6Promise.then(() => console.log('Resolved'))
            .catch(() => console.log('Failed'))
            .then(() => console.log('Always run this'));

JSFiddle 演示:https://jsfiddle.net/9frfjcsg/

或者,您可以扩展原型以包含方法(不推荐):finally()

Promise.prototype.finally = function(cb) {
    const res = () => this;
    const fin = () => Promise.resolve(cb()).then(res);
    return this.then(fin, fin);
};

JSFiddle 演示:https://jsfiddle.net/c67a6ss0/1/

还有Promise.prototype.finaling shim库。


答案 2