簡體   English   中英

按順序觸發異步調用

[英]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的同步部分。 那時,他們正在為完成而競爭。 無論它們完成的順序如何,您都會按順序獲得結果( afunction1的結果, bfunction2的結果,等等)。

如果服務器要求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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM