Javascript Node.js块响应

Javascript Node.js块响应,javascript,ajax,node.js,express,blocking,Javascript,Ajax,Node.js,Express,Blocking,当我的一个“长”响应以某种方式阻止另一个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

当我的一个“长”响应以某种方式阻止另一个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
这对我来说很酷,但在浏览器中,情况完全不同

所以看起来浏览器在第一次(长请求)时等待回答,然后才收到最后2个结果


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

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


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

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

因此,如果
GET/api/filters
执行大量CPU密集型计算,它将阻止任何其他请求,直到完成为止。添加更多关于其实际功能的信息有助于得出更好的答案


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

50毫秒以下的速度非常快,这有什么问题,可能是您的网络在本地macine上使用SSD,因此实时延迟将“稍微”长一点。实际上,51ms只是输出以响应之前缓存在内存中的大约300kb的JSON(无任何计算、DB请求等),为什么不把它放在一个真实的web环境中(AWS、Heroku),以确保您没有针对Ghostsb进行优化,但我只调用了3次,甚至是从控制台调用,以尽可能清楚地说明这种情况