批量下载,控制并发(利用promise 做需求池队列)
思路: 利用Promise模拟任务队列,从而实现请求池效果。
-
handQueue 函数:
参数: reqs 是一个数组,包含了要处理的请求的总数。 默认值处理: reqs 如果为空,则赋值为空数组 []。
requestQueue 函数: 创建一个请求队列,并控制最大并发数。 -
requestQueue 函数:
参数: concurrency 控制最大并发数,默认为 6。 变量: queue: 存储待处理的请求工厂函数。 current:
当前并发请求数。 -
dequeue 函数: 用于处理队列中的请求,确保并发数不超过 concurrency。 返回函数:
返回一个函数,该函数将请求工厂函数加入队列并触发 dequeue。 请求处理:
使用 enqueue 函数将请求工厂函数加入队列,并启动处理。
import axios from 'axios';export const handQueue = (reqs = [], concurrency = 6) => {const requestQueue = (concurrency) => {const queue = [];let current = 0;const dequeue = () => {while (current < concurrency && queue.length) {current++;const requestPromiseFactory = queue.shift();requestPromiseFactory().then(response => {// 处理成功的请求console.log('Response:', response);}).catch(error => {// 处理失败的请求console.error('Error:', error);}).finally(() => {current--;dequeue();});}};return (requestPromiseFactory) => {queue.push(requestPromiseFactory);dequeue();};};const enqueue = requestQueue(concurrency);for (let i = 0; i < reqs.length; i++) {enqueue(() => axios.get(`/api/test${i}`));}
};