0

当我的一个“长”响应以某种方式阻止另一个 AJAX 请求时,我遇到了不愉快的情况。我同时调用 3 个不同的资源:

var list = ['/api/filters','/api/criteria/brands','/api/criteria/genders']  
list.forEach(function(item){$.post(item)})

在服务器端,我可以在日志文件中看到以下时间:

GET /api/filters 304 51ms
GET /api/criteria/genders 200 1ms
GET /api/criteria/brands 200 0ms

这对我来说看起来很酷,但在浏览器中图片完全不同。

带有谷歌浏览器网络标签的图片

所以看起来浏览器首先等待答案(长请求),然后才收到最后两个结果。

这种行为的原因可能是什么?

4

2 回答 2

0

节点服务器运行是单线程的,任何使用 CPU 周期的代码都会阻塞整个进程。

因此,如果GET /api/filters进行大量 CPU 密集型计算,它将阻塞任何其他请求,直到完成。添加一些关于它实际作用的更多信息可以帮助组合一个更好的答案。

如果您在那里有 IO 操作,请尝试使它们异步。这将允许节点在第一个执行 IO 时为其他 URL 提供服务。

于 2013-01-23T12:05:06.960 回答
0

每个浏览器一次只处理特定数量的并发请求。如果您同时触发 10 个 ajax 请求,浏览器会将它们放在一个堆栈上并一个接一个地处理。

您可以在这个问题的 browsern 中找到有关并发请求的更多信息(因为其中还包括图像、javascript 等)。

于 2013-01-23T09:20:02.237 回答