文章目录
一、Promise
1、promise.all方法
Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调,返回一个包含所有异步结果的数组。
2、promise.race方法
Promise的race方法也提供了并行异步操作的能力,但只返回第一个改变状态的promise,而其他的promise虽然会继续执行到状态改变,但结果会被抛弃;
二、1.手写Promise.all方法
Promise.myall = function(arrays){
return new Promise((resolve,reject)=>{
let results = []; //保存每个promise的结果
let len = arrays.length;
let index = 0;
if(len == 0){
resolve(results); //直接返回空数组
return;
}
for(let i = 0;i<len;i++){
//为什么不直接使用arrays[i].then,因为arrarys[i]不一定是一个promise
Promise.resolve(arrays[i]).then(data=>{
results[i] = data;
index++;
if(index == len){
resolve(results);
}
}).catch(err=>{
reject(err);
})
}
})
}
2、手写promise.race方法
Promise.myRace = function(arrs){
return new Promise((resolve,reject)=>{
let len = arrs.length;
let result = null;
if(len == 0){
resolve(result);
return
}
for(let i = 0;i<len;i++){
Promise.resolve(arrs[i]).then(data=>{
resolve(data);
return;
}).catch(err=>{
resolve(err);
return;
})
}
})
}
3.测试用例
代码如下(示例):
let p1 = new Promise((resolve,reject)=>{
setTimeout(
console.log("1s");
resolve("1s");
,1000)
})
let p2 = new Promise((resolve,reject)=>{
setTimeout(
console.log("2s");
resolve("2s");
,2000)
})
let p3 = new Promise((resolve,reject)=>{
setTimeout(
console.log("3s");
resolve("3s");
,3000)
})
//测试promise.all方法
Promise.myall([p1,p2,p3]).then(data=>{
console.log(data);
}).catch(err=>{
console.log(err);
})
//测试promise.race方法
Promise.myRace([p1,p2,p3]).then(data=>{
console.log(data)
})
.catch(err=>{
console.log(err)
})
promise.all运行结果
promise.race运行结果
—