如何在 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 關鍵字,使用它們,我們可以以幾乎像同步程式碼一樣讀取的方式組織程式碼,並且不會丟失非同步程式碼的可讀性和靈活性。如果我們想要一個同步系統,非同步程式設計將是處理此問題的有用方法。