我试图理解async/await如何与Promissions一起工作。
代码
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;
}
const time = latestTime(); // Promise { <pending> }
发行
据我所知,wait应该是阻塞的,在上面的代码中,它似乎阻塞了返回一个对象 bl
原始的 timestamp
. 然后,我的函数返回原语值,但是时间变量被设置为挂起的承诺,而不是该原语。我错过了什么?
4条答案
按热度按时间monwx1rj1#
一
async
函数总是返回一个承诺。这就是它报告异步工作完成情况的方式。如果你在另一个地方使用它async
函数,您可以使用await
等待它的承诺,但在一个非-async
函数(通常在顶层或事件处理程序中),您必须直接使用承诺,例如:如果您是在javascript模块的顶层执行此操作,那么一些环境现在支持即将到来的顶层
await
在模块中:javascript引擎正在获得对顶级应用程序的支持
await
例如,webpack提供了实验支持。这是你的简历的粗略翻译
async
以明确的承诺条款履行职能:关于这一点的一些重要说明:
传递给的函数
new Promise
(承诺执行器函数)由同步调用new Promise
.这就是手术开始的原因,
web3.eth.getBlock
同步调用以开始工作。承诺执行人发现在承诺执行过程中抛出的任何错误(等)
new Promise
变成拒绝承诺。承诺回调中抛出的任何错误(如我们正在传递的错误)
then
)将被抓住并转化为拒绝。sxissh062#
异步前缀是一种承诺的 Package 器。
与
ftf50wuq3#
async
函数将返回Promise
无论如何返回值为“承诺”,因此在您的情况下,返回值为:因此,您还可以使用以下功能:
但是为了达成关于
async/await
功能阅读文档会更好。velaa5lx4#
简单的回答是:而不是
使用: