假設 api 服務器使用 HTTP/1.1,并且瀏覽器每個域的并發 TCP 連接數限制為 6。這是否意味著如果我一次執行 7 個 api 呼叫,Promise.all那么最后一個api將不得不等待第一個api請求通過網路回傳?
Promise.all([api(), api(), api(), api(), api(), api(), api()]) // 7 api calls
HTTP/2 是否也通過多路復用解決了這個問題,其中所有這些 API 呼叫都將在同一個連接上,因此它們不需要等待任何東西?
uj5u.com熱心網友回復:
這是否意味著如果我一次使用 Promise.all 進行 7 個 api 呼叫,那么最后一個 api 將不得不等待第一個 api 的請求通過網路回傳?
是的,它確實。
您的Promise.all([api(), api(), ...])陳述句將立即運行所有api()函式呼叫。這將導致發送前 6 個請求,第 7 個請求將排隊,直到前 6 個請求中的一個完成,在這種情況下,瀏覽器將發送第 7 個請求。
這種行為實際上與Promise.all(). 如果您這樣做,也會發生相同的行為:
const promises = [api(), api(), api(), api(), api(), api(), api()];
即使只有該陳述句,在前 6 個請求中的一個完成之前,第 7 個 http 請求也不會發送到主機。這完全是因為瀏覽器對同一主機的連接限制。
僅供參考,它Promise.all()仍然可以作業,所有 api 請求仍然可以作業,與您沒有達到連接限制相比,它只需要等待更長的時間來完成所有請求。
uj5u.com熱心網友回復:
是的,但這不是特定于Promise.all. 一般來說,像這樣的運算式
anotherFn([fn(), fn(), fn()])
相當于做
const r1 = fn();
const r2 = fn();
const r3 = fn();
anotherFn([r1, r2, r3]);
在傳遞結果之前,引數串列中的所有內容都會被評估。如果評估所有內容的程序產生了一堆 API 呼叫,那么另一個函式 -Promise.all或者anotherFn不可能對此做任何事情,因為這些發生在函式運行之前。
那么最后一個 api 將不得不等待第一個 api 的請求通過網路回傳?
如果我們可以假設限制如您所說 - 瀏覽器一次限制為 6 個到 API 的連接 - 那么是的。
是的,HTTP/2 在這些情況下很有幫助,因為它們每個域只需要一個連接,并且可以通過該連接發送多個請求,而不會遇到瀏覽器連接限制。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/488424.html
標籤:javascript http http2
下一篇:LateInitializationError:欄位“計劃”尚未初始化。決議JSON并在ListViewBuilder中顯示時
