非同步函數傳回 Promise,而不是值:揭示斷開連接
JavaScript 中的非同步程式設計帶來了程式碼執行的革命。特別是,非同步函數已成為編寫不會阻塞主事件循環的程式碼的流行方法。然而,處理非同步函數時遇到的一個常見陷阱是它們不會直接傳回最終值,而是傳回 Promise。這可能會令人困惑,特別是對於熟悉傳統同步程式設計的開發人員來說。
要理解非同步函數為何以這種方式運行,掌握 JavaScript 事件循環的概念非常重要。事件循環是一個單執行緒系統,用於管理瀏覽器或 Node.js 環境中的所有任務和回呼。當呼叫 async 函數時,它會立即傳回一個 Promise。 Promise 代表非同步任務的最終結果。然而,函數本身並不等待任務完成才傳回 Promise。這允許後續程式碼繼續執行而不會被阻塞。
考慮以下程式碼:
async function fetchData() { const data = await fetch('https://example.com/data.json'); return data; } fetchData().then((data) => { console.log(data); });
在此範例中, fetchData 函數傳回一個代表 fetch 操作的最終結果的 Promise 。但是,函數本身不會等待獲取完成才傳回 Promise。因此,在 Promise 解決之前,console.log(data) 語句不會執行。
要存取非同步函數的最終值,您需要使用 .then() 或 wait 方法。 .then() 方法附加一個回呼函數,該函數將在 Promise 解析時執行。在上面的範例中,.then() 方法用於列印 fetchData 函數傳回的資料。
或者,您可以在另一個非同步函數中使用 wait 關鍵字來等待 Promise 解析。這只能在非同步函數中實現,如下列程式碼所示:
async function callFetchData() { const data = await fetchData(); console.log(data); } callFetchData();
在此範例中,callFetchData 函數使用await 關鍵字等待 fetchData 函數在列印資料之前解析。
理解非同步函數的回傳值和它所代表的 Promise 之間的差異對於編寫高效且健壯的非同步程式碼至關重要。透過利用 .then() 方法或 wait 關鍵字,您可以存取非同步函數的最終值並避免與 Promises 相關的常見陷阱。
以上是為什麼 JavaScript 中的非同步函數會回傳 Promise 而不是值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!