问题
请实现如下的函数,可以批量请求数据,所有的url地址在urls参数中,同时可以通过max参数控制请求的并发度,当所有请求结束之后,需要执行callback回调函数。发请求的函数可以直接使用fetch即可。
1 | function sendRequest(urls: string[], max: number, callback: () => void) { |
问题分析
本题目关键在于抓住关键点
- 批量请求:要实现批量请求,而且并不需要按顺序发起请求(如果需要按顺序可以存入队列中,按优先级则可以存入优先队列中),这块儿存入数组中即可,然后遍历,取出每项fetch调用。
- 可控制并发度:在控制并发数的同时,每结束一个请求并发起一个新的请求。这里维护一个请求队列,使用递归的方式每次发起请求就推入队列,请求结束时从队列抛出。
- 全部请求结束,执行callback:每fetch回调then或者catch时,判断请求数组是否为空就来判断是否全部被调用完
代码实现
1 | function sendRequest(urls: string[], max: number, callback: () => void) { |
调用:
1 | const urls = Array.from({ length: 10 }, (v, k) => k); |
效果如下:
代码改进 async/await
1 | function sendRequest(urls: string[], max: number, callback: () => void) { |
调用:
1 | const urls = Array.from({ length: 10 }, (v, k) => k); |