理解非同步函數和Promise 之間的關係
在JavaScript 中,非同步函數可讓您編寫看起來同步的程式碼,從而簡化了異步編程它異步執行。然而,理解非同步函數如何與 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(),您可能會預期從web3.eth.getBlock接收時間戳記的原始值。但是,您會得到一個待處理的 Promise,如下所示:
const time = latestTime(); // Promise { <pending> }
為什麼回傳 Promise
非同步函數總是會傳回 Promise。當函數完成其非同步操作並提供最終值或因錯誤而拒絕時,此承諾就得到解決。在latestTime()的情況下,promise是用時間戳原語來解決的。
如何處理Promise
在另一個非同步函數之外,您可以使用then方法用於存取解析值或處理任何錯誤:
latestTime() .then(time => { console.log(time); }) .catch(error => { // Handle/report error });
頂級wait
現代環境支援模組中的頂級等待,允許您編寫如下程式碼:
const time = await latestTime();
此語法簡化了模組層級的Promise 的使用。但是,請記住,模組中未處理的 Promise 拒絕可能會導致模組無法載入。
了解具有 Promises 的非同步函數
更好地理解非同步函數如何結合使用 Promise,考慮 JavaScript 引擎如何將非同步函數編譯為 Promise執行器會很有幫助函數:
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中文網其他相關文章!