2013-01-23 132 views
0

當我的某個「long」響應以某種方式阻止另一個AJAX請求時,我有不愉快的情況。 我同時調用3個不同的資源:Node.js塊響應

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 

那看起來很酷我,但在瀏覽器中的畫面是絕對不同的。

picture with google chrome network tab

所以它看起來像瀏覽器等待答案在第一(長要求)和事後才收到最後2分的結果。

這種行爲的原因是什麼?

+0

50ms以下的速度非常快,這有什麼問題,它可能只是你的網絡 – adrian

+0

這對本地macine與固態硬盤,所以實時延遲將「一點點」更長。真正的51ms只是輸出到響應大約300kb先前緩存在內存中的JSON(沒有任何計算,數據庫請求等) – Alber

+0

爲什麼你不把它放在真正的Web環境中(AWS,Heroku),以確保你'不要爲鬼魂優化 – adrian

回答

0

每個瀏覽器一次只處理特定數量的同時請求。如果您同時激發10個Ajax請求,瀏覽器會將它們放在一個堆棧中,然後依次處理。

你可以在瀏覽器this question中找到關於併發請求的更多信息(因爲它包括圖像,JavaScript等)。

+0

但是我只會觸發3次通話,即使從控制檯也可以儘可能清楚地瞭解這種情況 – Alber

0

節點服務器運行的是單線程的,任何使用CPU週期的代碼都會阻塞整個進程。

因此,如果GET /api/filters執行大量CPU密集型計算,它將阻止任何其他請求,直到它完成。添加更多關於實際功能的信息可以幫助您將更好的答案放在一起。

如果您在那裏有IO操作,請嘗試使它們異步。這將允許節點在第一個進行IO時爲其他URL提供服務。