首页 > 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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板