假设把官方的promise.all去掉,实现自己的promise.all方法
搞清题意了没?
我们要搞清楚两个问题,
1.
let arr = []
arr[3] = 'str'
arr的长度是几,答案是3,
2.
当
function test(){
return new Promise((resolve)=>{
setTimeout(()=>{
resolve(123)
},3000)
})
}
Promise.resolve(
test()
).then((res)=>{
console.log(res)
})
这个我们会等resolve结束再执行console.log(res)
Promise本身有个all方法,首先我们把Promise.all = null
然后我们把
Promise.all = promiseAll
function promiseAll(param){
if(!Array.isArray(param)){
throw new Error('param is not Array') //首先判断下参数是不是数组
}else{
return new Promise((resolve)=>{ //return Promise,因为我们知道Promise.all是返回的Promise
let _arr_ = []
let index = 0
if(param.length == 0){
resolve(_arr_)
}
function processPromise(i,data){
_arr_[i] = data
if(++index == param.length){
//为什么我要重新定一个变量呢,如果换成_arr_.length会有什么问题呢
//因为当在3秒的那个执行完,他会将数组的第三项赋值,会造成第二项为空值
//输出结果很奇怪
resolve(_arr_)
}
}
for(let i=0;i<param.length;i++){
Promise.resolve(param[i]).then((data)=>{
console.log(111)
processPromise(i,data)
}).catch((err)=>{
console.log(err)
})
}
})
}
}
知道上面两个,我们就可以按顺序拿出我们想要的结果了