非同步函數傳回 Promise:詳細說明
在 JavaScript 中,理解非同步函數和 Promise 之間的交互作用至關重要。 JavaScript ES2017 引入的非同步函數允許非同步操作而不需要回呼。它們傳回一個 Promise,它代表非同步操作的最終結果。
考慮以下非同步函數:
async function latestTime() { const bl = await web3.eth.getBlock('latest'); console.log(bl.timestamp); // Returns a primitive console.log(typeof bl.timestamp.then == 'function'); // Returns false - not a promise return bl.timestamp; }
當函數latestTime 未在另一個非同步函數中使用時,就會出現混亂並被指派給非同步上下文之外的變數:
const time = latestTime(); // Promise { <pending> }
因此,時間變數變成待處理的Promise,而不是非同步函數傳回的原始值。發生這種情況是因為非同步函數總是傳回一個 Promise,即使它們在其主體內傳回一個原始值。
要正確處理這種情況,您有兩個選擇:
1。直接使用 Promise:
在非非同步上下文中,例如事件處理程序或模組頂層,必須直接處理 Promise。您可以使用then() 方法:
latestTime() .then(time => { console.log(time); }) .catch(error => { // Handle/report error });
2.模組中的頂層等待:
現代JavaScript 環境支援模組中的頂級等待,讓您編寫:
const time = await latestTime();
底層:
要了解JavaScript 引擎如何處理非同步函數,請將其重寫視為明確承諾回呼:
function latestTime() { return new Promise((resolve, reject) => { web3.eth.getBlock('latest') .then(bl => { console.log(bl.timestamp); console.log(typeof bl.timestamp.then == 'function'); resolve(bl.timestamp); }) .catch(reject); }); }
這個明確的Promise 語法突出了幾個要點:
以上是為什麼非同步 JavaScript 函數總是回傳 Promise,即使傳回原始值也是如此?的詳細內容。更多資訊請關注PHP中文網其他相關文章!