首頁 > web前端 > js教程 > JavaScript 中的非同步函數如何始終傳回 Promise?

JavaScript 中的非同步函數如何始終傳回 Promise?

Patricia Arquette
發布: 2024-12-20 11:50:09
原創
379 人瀏覽過

How Do Async Functions in JavaScript Always Return a Promise?

理解非同步函數和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 的 Promise 執行器函數。
  • 非同步操作開始於web3.eth.getBlock 被同步呼叫。
  • Promise 回呼用於解析或拒絕Promise。

因此,非同步函數有效地向呼叫程式碼傳回一個 Promise。

以上是JavaScript 中的非同步函數如何始終傳回 Promise?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板