手写promise.all()
function promiseAll(itertor){
let promises = Array.from(itertor)
let len = promises.length
let index = 0 //每当执行成功就+1,当index等于len的时候,说明所有数据都返回,则可以resolve
let data = [] //存放的是要返回的包含所有promise数据的数组
// 遍历这个promise数组
return new Promise((resolve,reject)=>{
for(let i in promises){
promises[i].then((res)=>{
data[i] = res //这里是在保证顺序是跟peomise的顺序是一致的
if(++index === len){
//这个时候说明所有的promise都执行完成了
resolve(data)
}
}).catch((err)=>{
reject(err) //只要有一个报错,整个Promises就reject
})
}
})
}
let promise1 = new Promise(function(resolve,reject){
console.log("1111")
resolve("promise1")
})
let promise2 = new Promise(function(resolve,reject){
console.log("2222")
// resolve("promise2")
reject("promise2")
})
let promise3 = new Promise(function(resolve,reject){
console.log("3333")
resolve("promise3")
})
promiseAll([promise1,promise2,promise3]).then((res)=>{
console.log("执行结果",res)
}).catch((err)=>{
console.log("执行结果err",err)
})
//promise2设置resolve的结果
1111
2222
3333
['promise1', 'promise2', 'promise3']
//promise2设置reject的结果
1111
2222
3333
执行结果err promise2
手写promise.race()
function promiseRace(itertor){
let promises = Array.from(itertor)
// 遍历这个promise数组
return new Promise((resolve,reject)=>{
for(let i in promises){
promises[i].then((res)=>{
resolve(res) //返回第一执行完成的结果,无所谓是哪个promise先执行完成
}).catch((err)=>{
reject(err) //只要有一个报错,整个Promises就reject
})
}
})
}
let promise1 = new Promise(function(resolve,reject){
console.log("1111")
setTimeout(()=>{
resolve("promise1")
},100)
})
let promise2 = new Promise(function(resolve,reject){
console.log("2222")
// resolve("promise2")
reject("promise2")
})
let promise3 = new Promise(function(resolve,reject){
console.log("3333")
setTimeout(()=>{
resolve("promise3")
},200)
})
promiseRace([promise1,promise2,promise3]).then((res)=>{
console.log("执行结果",res)
}).catch((err)=>{
console.log("执行结果err",err)
})
//执行结果,可以设置定时器来看是不是返回最先执行完成的结果
1111
2222
3333
执行结果err promise2
promise.all()和promise.race()的相同
无论执行结果是什么,数组里面的每个promise都会执行。
promise.all()和promise.race()的不同
- promise.all():数组中所有项都resolve才resolve,只要有一个是reject,就是reject。
- promise.race():执行结果是最先完成的那个promise的结果。