多个请求控制并发数

25 阅读1分钟

为什么要控制并发数量

  • 一个tcp连接只能发6个请求

  • 减小服务器压力

  • 避免请求超时

并发控制实现

const urls = [];  
for (let i = 1; i <= 20; i++) {  
    urls.push(`https://jsonplaceholder.typicode.com/todos/${i}`);  
}  
concurrencyRequest(urls, 5).then(res => {  
    console.log(res);  
})

const concurrencyRequest = (urls, maxNum) => {  
    return new Promise((resolve) => {  
        if (urls.length === 0) {  
            resolve([]);  
            return;  
        }  
        const results = [];  
        let index = 0// 下一个请求的下标  
        let count = 0// 当前请求完成的数量  
  
        // 发送请求  
        async function request() {  
            if (index === urls.lengthreturn;  
            const i = index; // 保存序号,使result和urls相对应  
            const url = urls[index];  
            index++;  
            console.log(url);  
            try {  
                const resp = await fetch(url);  
                // resp 加入到results  
                results[i] = resp;  
            } catch (err) {  
                // err 加入到results  
                results[i] = err;  
            } finally {  
                count++;  
                // 判断是否所有的请求都已完成  
                if (count === urls.length) {  
                    console.log('完成了');  
                    resolve(results);  
                }  
                request();  
            }  
        }  
  
        // maxNum和urls.length取最小进行调用  
        const times = Math.min(maxNum, urls.length);  
        for(let i = 0; i < times; i++) {  
            request();  
        }  
    })  
}

参考文章