我写了一个 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 请求。