并发请求

67 阅读1分钟
/*
 @params {string[]} url 请求地址
 @params {number} limit 最大并发数
*/
function concurrentRequest(urls: string[], limit: number) {
    if (urls.length === 0) {
        return Promise.resolve([]);
    }
    return new Promise((resolve, reject) => {
        let nextIdx = 0; // 下一个请求的url地址的索引
        const result: any[] = []; // 返回结果数组
        let count = 0; // 当前已完成的promise数量
        async function _request() {
            const i = nextIdx;
            const url = urls[nextIdx];
            nextIdx++;
            const resp = await fetch(url);
            result[i] = resp;
            count++;
            // 补位 有请求完毕 释放一个请求位置 重新添加新的请求
            if (nextIdx < urls.length) {
                _request();
            }
            // 如果所有请求都完成,resolve结果
            if (count === urls.length) {
                resolve(result);
            }
            console.log(result);
        }
        for (let i = 0; i < Math.min(urls.length, limit); i++) {
            _request();
        }
    })
}