理解异步函数和 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中文网其他相关文章!