请求并发控制数量

2023-09-06  本文已影响0人  Cherry丶小丸子
/**
 * 最大请求并发数,返回Promise
 * @param {string[]} urls 请求urls数组
 * @param {number} maxNum 最大请求数量
 * @returns {Promise<any[]>} Promise
 */
function concurRequest(urls, maxNum) {
    return new Promise(resolve => {
        // 当 urls 数组为 0 时直接结束
        if (urls.length === 0) {
            resolve([]);
            return;
        }
        const results = []; // 存储每个请求的结果
        let index = 0; // 下一个请求的下标
        let count = 0; // 请求完成的数量,包括成功和失败

        // 发出请求
        async function request() {
            // 当请求等于 urls 数组长度,结束不在继续发请求了
            if (index === urls.length) {
                return;
            }

            const i = index; // 记录当前发出请求的下标
            const url = urls[index];
            index++; // 每发出一个请求,下标加1

            try {
                const value = await fetch(url);
                results[i] = value;
            } catch (error) {
                results[i] = error;
            } finally {
                count++;
                // 当完成请求的数量等于urls的长度时,结束
                if (count === urls.length) {
                    resolve(results);
                }
                request(); // 每个请求结束后继续发请求
            }
        }

        // 取urls的长度和与maxNum的最小値,发出请求
        const times = Math.min(maxNum, urls.length);
        for (let i = 0; i < times; i++) {
            request();
        }
    });
}


const urls = [];
for(let i = 1; i <= 20; i++){
    urls.push(`https://jsonplaceholder.typicode.com/todos/${i}`)
}

concurRequest(urls, 3).then(res => {
    console.log(res);
})
上一篇 下一篇

猜你喜欢

热点阅读