浏览器中的并发 AJAX 请求在并发限制下降级为串行请求?

问题描述 投票:0回答:0

我写了一个 Tampermonkey 脚本,它使用 AJAX 发出并发请求并强制限制并发请求的数量。但是,我注意到当 devTool 打开时,脚本的行为与并发 AJAX 请求的预期一致,但是当 devTool 关闭时,请求会被串行处理。为什么会这样?


let rangeArray = (start, end) => Array(end - start + 1).fill(0).map((v, i) => i + start)

//copy by tiny-pool as concurrent limit tool
function asyncPool(poolLimit, iterable, iteratorFn) {
        let i = 0;
        const ret = [];
        const executing = new Set();
        const enqueue = function() {
            if (i === iterable.length) {
                return Promise.resolve();
            }
            const item = iterable[i++];
            const p = Promise.resolve().then(() => iteratorFn(item, iterable));
            ret.push(p);
            executing.add(p);
            const clean = () => executing.delete(p);
            p.then(clean).catch(clean);
            let r = Promise.resolve();
            if (executing.size >= poolLimit) {
                r = Promise.race(executing);
            }
            return r.then(() => enqueue());
        };
        return enqueue().then(() => Promise.all(ret));
    }

$(".vzsss button").click(()=>{
        let num = $(".vzsss input").val()
        let tpId = window.location.pathname.split("/")[window.location.pathname.split("/").length-1]
        let count = 0;
        asyncPool(10,rangeArray(0,num-1),(i)=>            
             fetch(`https://xxxxxxx`)
            .then(()=>{
                count++;
                $(".vzsss span").text(`已刷${count}`);})
        )
    })

环境:

操作系统:WINDOWS 10

浏览器:Microsoft Edge 111.0.1661.51

HTTP协议版本:http/2

我注意到当我打开/关闭 devTool 时,我的脚本执行效率有显着差异。打开devTool后,可以观察到并发请求,脚本执行效率明显提升。为了验证这个观察结果,我使用 Fiddler 抓包并确认当 devTool 打开时,HTTP 请求是并发发送的,而当它关闭时,它们是串行发送的。

我想了解为什么会发生这种情况,以及是否可以在不打开 devTool 的情况下限制并发 AJAX 请求。

ajax browser concurrency
© www.soinside.com 2019 - 2024. All rights reserved.