- 这是今天面试的时候遇到的题目,之前也面到过秒解了,结果今天卡壳了没写出来。
- 面试官提醒说用Promise.all来分批请求。但是我觉得不对,如果一批请求里有一个请求很慢,那所有都得等他请求完才行。
- 以下是我的方法,仅供讨论:
声明一个请求函数,在then里,即上一个请求结束后,递归地调用下一个请求
let urls = Array.from(new Array(100).keys()) // 生成请求的url
// 模拟异步请求
const sendMessage = (url) => {
return new Promise((resolve) => {
console.log(`start request ${url}`);
setTimeout(() => {
resolve(url);
},Math.random()*10000);
})
}
// 递归调用函数
const limitMessages = (urls ,limit) => {
let count = 0;
let lens = urls.length;
const pooling = (url) => {
sendMessage(url).then((v) => {
console.log(`request ${v} finished`);
if(++count < lens){
pooling(urls[count]);
}
})
}
for(let i = 0 ; i < limit ; i++){
pooling(urls[count++]);
}
}
// 调用方法
limitMessages(urls,5)
做讨论用,如果有什么问题欢迎指出。