[英]Fire async calls in order
我現在有一些看起來像這樣的代碼:
const a = await function1();
const b = await function2();
const c = await function3();
但是我正在嘗試優化速度並且不希望延遲。 我嘗試過以下操作
[const a, const b, const c] = await Promise.all([function1, function2, function3)]
這很好用,但是我遇到的問題是我無法保留從我的機器發起的調用的順序。 當我在每個請求上發送一個隨機數時,如果它按照 1 -> 3 -> 2 而不是 1->2->3 的順序進行,最終服務器將拒絕該請求。
有沒有辦法使用 Promise.all 不等待每個 function 完成但仍保留調用順序?
如果你這樣做:
const [a, b, c] = await Promise.all([function1(), function2(), function3()];
function1
的同步部分將首先運行,然后是function2
的同步部分,然后是function3
的同步部分。 那時,他們正在為完成而競爭。 無論它們完成的順序如何,您都會按順序獲得結果( a
是function1
的結果, b
是function2
的結果,等等)。
如果服務器要求function2
的異步部分在function1
啟動之前完成,那么您必須使用您的原始代碼。 您在客戶端代碼中擁有的唯一控制是進程何時開始。
但是,這並不意味着不可能對它們進行一點優化,但這在很大程度上取決於它們的工作。 例如,如果重要的是您在啟動function2
之前收到了響應function1
的請求而發送的標頭,但function1
在收到標頭后會進行進一步處理(例如讀取響應的正文並對其進行處理),您可以對其進行優化,但將function1
分為兩部分:啟動進程並使用標頭的部分,以及使用主體並對其進行處理的部分。
如果你這樣做了,你會這樣做:
// Do the first part in series
const r1 = await function1PartA();
const r2 = await function2PartA();
const r3 = await function3PartA();
// Do the remainder in parallel
const [a, b, c] = await Promise.all([
function1PartB(r1),
function2PartB(r2),
function3PartB(r3)
]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.