浏览器针对Promise的一些兼容方法|给你代码

浏览器针对Promise的一些兼容方法|给你代码

编码文章call10242025-09-18 15:08:191A+A-

前言

promise是现代web比较常用的一个技术,拜托繁琐的嵌套回调。让我们看一些现代浏览器的支持度。

canisue 可以查看各个属性的兼容性。其实各个浏览器的支持度都还可以,我下面放出一些可能会出现不兼容情况的polyfill。

补充polyfill

1.promise相关 ,promise.all只能返回全部resolve的,如果有一个reject就会在catch里返回这个状态。所以现在有一个需求,能实现无论是否resolve或者reject都能把结果放进返回的数组里返回。现有 Promise.allSettled() (TC39第4阶段草案)。以下是一种polyfill。其实他和all的差距就是在catch的处理上,一个是直接reject。

/**
 * Promise全部执行完
 * @param {Array<Promise|Number>} args
 * @return {Promise}
 */
Promise.allFinally = function (args) {
    return new Promise(resolve => {
        const response = [];
        let len = args.length;

        function setRes(index, value, response, status) {
            response[index] = {
                status,
                value
            };
            len--;
            if (len === 0) {
                resolve(response);
            }
        }

        args.forEach((item, index) => {
            if (item.constructor === Promise) {
                item.then(res => {
                    setRes(index, res, response, "fufilled");
                }, err => {
                    setRes(index, err, response, "rejected");
                })
            } else {
                setRes(index, item, response);
            }
        })
    })
}

2.Promise.finally 由于有一部分不支持这个方法所以有以下polyfill. finally实际不接受参数,他直接是写一次then,catch。避免你在写多余的东西。

Promise.prototype.finally = function(cb) {
    return this.then(cb).catch(cb);    
}



给你代码|往期回顾:

给你代码:阿里云短信验证码登录开发集成

给你代码:网站图标favicon自动抓取

给你代码:网站微信登录接入


点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4