重写promise.all
时间: 2023-11-17 19:57:45 浏览: 39
重写Promise.all的目的是为了解决原生Promise.all存在的两个问题:传递的参数可能不是Promise类型,可能不存在then方法;如果中间发生错误,应该直接返回错误,不执行后面操作。下面是一个改造版本的实现:
Promise.prototype.all = function(promises) {
let results = new Array(promises.length);
let promiseCount = 0;
let promisesLength = promises.length;
return new Promise(function(resolve, reject) {
for (let val of promises) {
Promise.resolve(val).then(function(res) {
promiseCount++;
results[promiseCount] = res;
if (promiseCount === promisesLength) {
return resolve(results);
}
}, function(err) {
return reject(err);
});
}
});
};
这个改造版本的实现使用了Promise.resolve()方法来确保传递的参数都是Promise类型,并且使用了一个计数器来确保所有的Promise都正确执行了。如果中间发生错误,直接返回错误,不执行后面操作。