返回承诺而不是值的异步函数

yhived7q  于 2021-09-13  发布在  Java
关注(0)|答案(4)|浏览(319)

我试图理解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 . 然后,我的函数返回原语值,但是时间变量被设置为挂起的承诺,而不是该原语。我错过了什么?

monwx1rj

monwx1rj1#

async 函数总是返回一个承诺。这就是它报告异步工作完成情况的方式。如果你在另一个地方使用它 async 函数,您可以使用 await 等待它的承诺,但在一个非- async 函数(通常在顶层或事件处理程序中),您必须直接使用承诺,例如:

latestTime()
.then(time => {
    console.log(time);
})
.catch(error => {
    // Handle/report error
});

如果您是在javascript模块的顶层执行此操作,那么一些环境现在支持即将到来的顶层 await 在模块中:

const time = await latestTime();

javascript引擎正在获得对顶级应用程序的支持 await 例如,webpack提供了实验支持。
这是你的简历的粗略翻译 async 以明确的承诺条款履行职能:

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);
    });
}

关于这一点的一些重要说明:
传递给的函数 new Promise (承诺执行器函数)由同步调用 new Promise .
这就是手术开始的原因, web3.eth.getBlock 同步调用以开始工作。
承诺执行人发现在承诺执行过程中抛出的任何错误(等) new Promise 变成拒绝承诺。
承诺回调中抛出的任何错误(如我们正在传递的错误) then )将被抓住并转化为拒绝。

sxissh06

sxissh062#

异步前缀是一种承诺的 Package 器。

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;
}

function latestTime() {
    return new Promise(function(resolve,success){
        const bl = web3.eth.getBlock('latest');
        bl.then(function(result){
            console.log(result.timestamp); // Returns a primitive
            console.log(typeof result.timestamp.then == 'function'); //Returns false - not a promise
            resolve(result.timestamp)
        })
}
ftf50wuq

ftf50wuq3#

async 函数将返回 Promise 无论如何返回值为“承诺”,因此在您的情况下,返回值为:

async function latestTime(): Promise<some primitive> {
  const bl = await web3.eth.getBlock('latest');
  return bl.timestamp;
}

因此,您还可以使用以下功能:

const time = await latestTime();

但是为了达成关于 async/await 功能阅读文档会更好。

velaa5lx

velaa5lx4#

简单的回答是:而不是

result = await asyncFunction();

使用:

result = await asyncFunction().then(value => value);

相关问题