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

Javascript 异步函数返回承诺,而不是值,javascript,promise,async-await,primitive,Javascript,Promise,Async Await,Primitive,我试图理解async/await如何与Promissions一起工作 代码 异步函数latestTime(){ const bl=wait web3.eth.getBlock(“最新”); console.log(bl.timestamp);//返回原语 console.log(typeof bl.timestamp.then=='function');//返回false-不是承诺 返回bl.timestamp; } 常量时间=最晚时间();//承诺{} 问题 据我所知,await应该是阻塞的

我试图理解async/await如何与Promissions一起工作

代码 异步函数latestTime(){ const bl=wait web3.eth.getBlock(“最新”); console.log(bl.timestamp);//返回原语 console.log(typeof bl.timestamp.then=='function');//返回false-不是承诺 返回bl.timestamp; } 常量时间=最晚时间();//承诺{} 问题
据我所知,await应该是阻塞的,在上面的代码中,它似乎阻塞了返回带有原语
时间戳的对象
bl
。然后,我的函数返回原语值,但是时间变量被设置为挂起的承诺,而不是该原语。我缺少什么?

异步前缀是一种承诺的包装器

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

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

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

但要获得有关
async/await
特性的一般视图,最好阅读文档

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

latestTime()
.then(time => {
    console.log(time);
})
.catch(error => {
    // Handle/report error
});
如果您是在JavaScript模块的顶层执行此操作,则某些环境现在支持以下功能:

JavaScript引擎正在获得对顶级
wait
的支持,例如


以下是您的
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);
    });
}
关于这一点的一些重要说明:

  • 传递给
    newpromise
    的函数(Promise executor函数)由
    newpromise
    同步调用。
    • 这就是操作开始的原因,
      web3.eth.getBlock
      被同步调用以开始工作
  • 承诺执行者抛出的任何错误(等)都会被
    新承诺
    捕获,并转化为承诺拒绝
  • 承诺回调中抛出的任何错误(如我们正在传递的
    然后
    )都将被捕获并转换为拒绝

    • 简短的回答是:代替

      result=等待异步函数();
      
      使用:

      result=wait asyncFunction()。然后(value=>value);
      
      异步函数就是这么做的-读取
      await应该是阻塞的
      javascript中的无阻塞代码是一个“坏主意”™ async/await与allEvery的阻塞无关
      async函数
      返回一个承诺,以便在其中您可以
      await
      其他承诺,这就是全部要点感谢您的描述性回答,我显然没有抓住重点。只是附带说明一下:
      async
      函数的翻译有几个问题。从非常广泛的概念上讲,它是可以接受的,但不能正确处理拒绝,有语法错误,并且给传递给承诺执行器的第二个参数(用于拒绝承诺的函数)起了一个非常令人惊讶的名字(
      success
      ?!)。:-)
      latestTime()
      .then(time => {
          console.log(time);
      })
      .catch(error => {
          // Handle/report error
      });
      
      const time = await latestTime();
      
      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);
          });
      }