Node.js阻止响应

时间:2013-01-23 09:16:15

标签: javascript ajax node.js express blocking

当我的某个“长”响应以某种方式阻止另一个AJAX请求时,我有一种不愉快的情况。 我同时打电话给3种不同的资源:

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

在服务器端,我可以在logfile中看到以下时间:

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

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

picture with google chrome network tab

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

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

2 个答案:

答案 0 :(得分:0)

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

您可以在this question中的browsern中找到有关并发请求的更多信息(因为其中包括图片,javascript等)。

答案 1 :(得分:0)

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

因此,如果GET /api/filters执行了大量CPU密集型计算,它将阻止任何其他请求,直到完成为止。添加一些关于实际操作的更多信息可以帮助我们做出更好的答案。

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