首页 > web前端 > js教程 > 为什么异步 JavaScript 函数总是返回 Promise,即使返回原始值也是如此?

为什么异步 JavaScript 函数总是返回 Promise,即使返回原始值也是如此?

Mary-Kate Olsen
发布: 2024-12-18 15:05:13
原创
580 人浏览过

Why Do Async JavaScript Functions Always Return Promises, Even When Returning Primitive Values?

异步函数返回 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 语法突出了几个要点:

  • Promise 执行器函数(传递给 new Promise)同步运行,这就是 web3.eth.getBlock 的原因立即调用。
  • Promise 执行器或其回调中抛出的错误将被捕获并作为 Promise 传播拒绝。

以上是为什么异步 JavaScript 函数总是返回 Promise,即使返回原始值也是如此?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板