如何在 JavaScript 中返回非同步呼叫結果?


非同步程式設計在 JavaScript 網路程式設計中相當常見。在這種方法中,我們可以下載或執行一些依賴時間的任務,而不會阻塞當前的執行流程。與我們的程式相比,它非同步執行,可以使用 JavaScript 中的非同步函式來完成。在本文中,我們將討論在 JavaScript 中返回非同步呼叫結果的技術。

在深入瞭解這個概念之前,讓我們看看在非同步執行呼叫生效時,哪些情況會讓開發者感到困惑。讓我們看看以下情況。

語法

function aTrivialFunction() {
   ajaxCall(..., function onSuccess(result) {
      // somehow return result from this function
   });
}
Display ('result of aTrivialFunction', aTrivialFunction() );

在這種情況下,我們使用的是 AJAX 呼叫,它代表了一種更通用的模式,即同步呼叫並返回非同步函式的結果。在 JavaScript 中,不可能將非同步呼叫轉換為同步呼叫。在本文的後面部分,我們將討論非同步呼叫如何工作以及如何返回結果。

非同步函式有幾種不同的型別。這些列在下面:

  • 回撥 - 非同步函式可以是回撥函式。這可以作為引數傳遞給其他函式,並在完成時使用所需的值呼叫。回撥函式可以用一個例子來解釋,讓我們考慮上面程式碼中描述的 ajaxCall 函式,它將回調函式作為其第一個引數。當 ajaxCall 完成其 HTTP 請求時,將呼叫此回撥函式。我們的回撥函式將請求的結果作為其第一個引數。

  • Promise - Promise 是 JavaScript 中的新特性,隨 JavaScript 版本 ECMAScript 6 (ES2015) 一起出現。我們可以說 Promise 是一個從非同步函式同步返回的物件,它可以跟蹤該函式的狀態。Promise 可以具有以下狀態:

          等待中:這是初始階段,既未完成也未拒絕

          已完成:當操作成功完成時

          已拒絕:當操作由於某些錯誤條件而失敗時

  • Async/Await - async 和 await 關鍵字提高了程式碼的可讀性,看起來更同步。可以使用它們來處理冗長的巢狀 Promise。

從非同步函式呼叫中返回結果

為了解決上述問題,我們可以返回一個“Promise”物件,而不返回直接結果。透過返回 Promise,呼叫函式將在結果到達時立即處理結果。讓我們看看解決問題的類似語法。

語法

function aTrivialFunction() {
   return new Promise( (resolve, reject) => {
      ajaxCall(..., function onSuccess(result) {
         resolve( result );
      });
   });
}
const result = await aTrivialFunction()
Display ( 'result of aTrivialFunction', result );

在上面的語法中,我們返回一個 Promise 物件。這個 Promise 物件是一個立即返回的物件,可用於跟蹤非同步呼叫的狀態。每當呼叫 resolve 函式時,它都會發出非同步呼叫已完成的訊號,換句話說,Promise 已解決。Promise 也適用於錯誤情況,但在這個例子中沒有顯示。為了指示錯誤,我們可以呼叫 reject 函式。

我們只有在 async 函式中才能使用 await。因此,如果我們在程式的全域性執行上下文中,我們需要將程式碼包裝到非同步環境中,語法如下:

語法

(async () => {
   const res = await myFunction();
   console.log( 'Getting result from asynchronous environment:', res);
})();

結論

不可能將非同步函式轉換為同步函式。但是,我們不需要這樣做。我們可以使用 async 和 await 關鍵字,使用它們,我們可以以幾乎像同步程式碼一樣讀取的方式組織程式碼,並且不會丟失非同步程式碼的可讀性和靈活性。如果我們想要一個同步系統,非同步程式設計將是處理此問題的有用方法。

更新於:2022年8月23日

389 次瀏覽

啟動你的 職業生涯

完成課程後獲得認證

開始學習
廣告