一、promise.all 的使用
let promise1 = new Promise(function(resolve) {
resolve(1);
});
let promise2 = new Promise(function(resolve) {
resolve(2);
});
let promise3 = new Promise(function(resolve) {
resolve(3);
});
let promiseAll = Promise.all([promise1, promise2, promise3]).then(function(res) {
console.log(res);
});
二、实现
简化版本
Promise.all = function(promises) {
let results = [];
return new Promise(function(resolve) {
promises.forEach(function(val) {
// 按顺序执行每一个Promise操作
val.then(function(res) {
results.push(res);
});
});
resolve(results);
});
}
这是最简化的版本,但是也有两个问题。一、Promise.all传递的参数可能不是Promise类型,可能不存在then方法。二、如果中间发生错误,应该直接返回错误,不执行后面操作。
升级版本:
Promise.prototype.all = function(promises) {
let results = [];
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.push(res); 应该用下标 而不是push
results[i] = res;
// 当所有函数都正确执行了,resolve输出所有返回结果。
if (promiseCount === promisesLength) {
return resolve(results);
}
}, function(err) {
return reject(err);
});
}
});
};