blog
blog copied to clipboard
finally垫片用于支持Promise.finally
finally()
方法返回一个Promise
。在promise结束时,无论结果是fulfilled或者是rejected,都会执行指定的回调函数。这为在Promise
是否成功完成后都需要执行的代码提供了一种方式。
Promise.finally
存在兼容性问题,并不是所有的浏览器都支持,但是有finally
又很方便,可以通过垫片实现;
单页应用入口JS
引入如下代码:
import 'regenerator-runtime/runtime';
if (!Promise.prototype.finally) {
// eslint-disable-next-line func-names
Promise.prototype.finally = function (callback) {
const P = this.constructor;
return this.then(
value => P.resolve(callback()).then(() => value),
reason => P.resolve(callback()).then(() => {
throw reason;
})
);
};
}
后续的promise就可以支持finally
了;
示例:
const queryData = async () => {
Spin.show('信息获取中...');
//这样无论这个query接口是否正常还是异常,都会执行Spin.hide去关闭遮罩层,否则还需要再catch中也写一遍
const data = await query().finally(Spin.hide);
if(data){
....
}
}