xianzou / blog

弦奏的博客 一个混迹多年的前端开发人员,正在努力的学习中
17 stars 2 forks source link

finally垫片用于支持Promise.finally #47

Open xianzou opened 3 years ago

xianzou commented 3 years ago

finally() 方法返回一个Promise。在promise结束时,无论结果是fulfilled或者是rejected,都会执行指定的回调函数。这为在Promise是否成功完成后都需要执行的代码提供了一种方式。

这避免了同样的语句需要在then()catch()中各写一次的情况;

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){
       ....
    }
}