直接干货
实现一个并发请求函数concurrencyRequest(urls, maxNum),要求如下:
- 要求最大并发数 maxNum
- 每当有一个请求返回,就留下一个空位,可以增加新的请求
- 所有请求完成后,结果按照 urls 里面的顺序依次打出(发送请求的函数可以直接使用fetch即可)
效果如下:
代码如下:
function concurrencyRequest(urls, maxNum) {
function fn() {
// 取较小值,即当前最大可并发数量
let max = Math.min(urls.length, maxNum);
for (let i = 0; i < max; i++) {
let url = urls.shift();
maxNum--;
fetch(url).finally(() => {
console.log(url)
maxNum++;
// 利用异步,执行回调时,maxNum++并递归
fn();
});
}
}
fn();
}
通过下方代码测试,效果见上图:
const urls = [];
for (let i = 1; i <= 20; i++) {
urls.push(`https://jsonplaceholder.typicode.com/todos/${i}`);
}
concurrencyRequest(urls, 3)
Tip:思路
每当有请求完成时,就需要重新去发请求。需要不断的去重新发送请求,思考这里,明显可以通过递归完成。
1、递归结束条件:请求发送完,即urls长度为0
2、递归参数:不需要,通过改变数组来完成
3、递归返回值:不需要,目的是发送请求
4、每次递归需要做什么:通过改变maxNum,来明确该次递归需要发送几次请求。
小彩蛋
执行结果并不是顺序返回的哦
觉得有用的小伙伴们给个赞吧!