笑红尘 2022-05-04 13:44:02
const req = (url:string):Promise<any> => {
return new Promise((resolve,reject) => {
const xhr = new XMLHttpRequest();
xhr.open('get',url,true); //这里第三个参数不能为false,会变成同步
xhr.onload = () => {
if(xhr.status === 200){
resolve(url)
}else{
reject(url)
}
}
xhr.send();
})
}
const multiRequest = (urls:string[],maxNum:number):Promise<any> => {
let i = 0;
const ret:any = []; // 完成集合
const executing:any = [];// 执行集合
const enqueue = ():Promise<void> => {
if(urls.length === i){ // 判断是否全部执行完
return Promise.resolve();
}
const p = Promise.resolve().then(() => req(urls[i++]));
ret.push(p);
const e = p.then(() => executing.splice(0,1));// 执行完从executin中剔除一个
executing.push(e);
let r = Promise.resolve();
if(executing.length >= maxNum){// 判断executing中的长度是否大于等于限制数maxNum
r = Promise.race(executing);
}
return r.then(() => enqueue());// 当 r = Promise.race 时会等到其中一个执行完才执行下一步
}
return enqueue().then(() => Promise.all(ret)) //全部执行完按顺序返回
}
multiRequest(Array.from({length:10},(u,i) => ('/api/test?' + i)),2)
.then(res => {
console.log(res) // ["/api/test?0", "/api/test?1", "/api/test?2", "/api/test?3", "/api/test?4", "/api/test?5", "/api/test?6", "/api/test?7", "/api/test?8", "/api/test?9"]
})
如果网络太好,建议将Network throttling 调成Fast 3G。
- 共 1 页
- 1
第 92 题:已知数据格式,实现一个函数 fn 找出链条中所有的父级 id