实现Promise.allSettled

3,491 阅读1分钟

#业务场景 微信小程序中多张图片选择后一起上传时需判断多张图片的异步上传结果,成功了几张,失败了几张 最新ES2020已有Promise.allSettled,可在代码中先查看是否已有 #代码

Promise.allSettled = Promise.allSettled || function(promises) {
    return new Promise(function(resolve, reject) {
        if (!Array.isArray(promises)) {
            return reject(
                new TypeError("arguments must be an array")
            );
        }
        let resolvedCounter = 0;
        const promiseNum = promises.length;
        // 统计所有的promise结果并最后返回
        const resolvedResults = new Array(promiseNum);
        for (let i = 0; i < promiseNum; i++) {
            Promise.resolve(promises[i]).then(
                function(value) {
                    resolvedCounter++;
                    resolvedResults[i] = value;
                    if (resolvedCounter == promiseNum) {
                        return resolve(resolvedResults);
                    }
                },
                function(reason) {
                    resolvedCounter++;
                    resolvedResults[i] = reason;
                    if (resolvedCounter == promiseNum) {
                        return resolve(reason);
                    }
                }
            );
        }
    });
};