异步函数返回 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 语法突出了几个要点:
以上是为什么异步 JavaScript 函数总是返回 Promise,即使返回原始值也是如此?的详细内容。更多信息请关注PHP中文网其他相关文章!