在日程开发中,promise.all可以帮助我们多个异步请求过来,再去进一步操作。
Promise.all([
new Promise((resolve,reject) => {
const result = 1000;
setTimeout(()=>{ resolve(result) },1000);
}),
new Promise((resolve,reject) => {
const result = 2000;
setTimeout(()=>{ resolve(result) },2000);
})
]).then(result =>{
console.log(result);
});
‘
2s可以看出后result结果是一个数组[1000,2000]
那promise.all是怎么实现的呢?循环数组的每一项,执行promise里面的then方法,将结果放到数组中。
Promise.prototype.all = function (promises){
let results = [];
return new Promise(function(resolve){
promises.forEach(function(val){
val.then(function(res){
results.push(res)
})
resolve(results);
})
})
}
上述参数要求必须是一个promise,假如传入参数不是promise类型,那就需要进一步处理
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);
if (promiseCount === promisesLength) {
return resolve(results);
}
}, function(err) {
return reject(err);
});
}
});
};