【发布时间】:2019-09-11 16:18:41
【问题描述】:
在我的服务器上请求资源时,我遇到了 Mac OS 的网络问题(问题并非一直存在)。但是,我可以通过使用 JavaScript 顺序请求随机资源 1000 次来重现该问题。
var req = (id) => fetch('https://www.example.com/my/resource/starter.js?' + id);
// use the 'limit' as identifier
var doRecursiveRequest = (limit) =>
req(limit).then(res => {
if (--limit) {
return doRecursiveRequest(limit);
}
});
doRecursiveRequest(1000);
在网络选项卡中,我看到资源加载速度非常快。请求计数器计数很快,突然停止。之后大约需要 30 秒,它会一直持续到它再次停止(总是在几百个请求之后)。一段时间后,所有请求都会成功完成。
通过使用 Google Devtools(性能选项卡),我可以看到问题所在,但我不明白原因。
在某个时候,有 6 个并行网络任务正在运行(全部由我的 JavaScript 执行)。似乎 Chrome 最多允许并行处理 6 个这样的微任务。之后,最多需要 30 秒才能“杀死”一个(?!),然后允许下一个开始。但是,在服务器端,响应时间都非常快(所有 1000 个请求都已到达服务器并发送了响应)。
附加信息:
- 我只在 Mac OS(Google Chrome、Safari 和 Firefox)上遇到这个问题
- 在 Windows 10 上,它按预期工作;没有待处理的请求(来自服务器的响应时间除外)
- 打印屏幕来自 Windows 机器,但记录的 chrome-dev 配置文件在 Mac OS 上
- 系统详细信息:MacBook Pro / OS X El Capitan(版本 10.11.6)/Google Chrome 76.0.3809.132(64 位)
【问题讨论】:
-
听起来像是浏览器或操作系统中的错误/怪癖。您可以切换到 XMLHttpRequest 并指定timeout。
-
@wOxxOm 不幸的是,它并没有改变什么。类似的行为。
标签: javascript macos google-chrome networking google-chrome-devtools