当前位置: 首页 > 知识库问答 >
问题:

异步函数返回promise,而不是值

常雅达
2023-03-14

我试图了解异步/等待如何与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;
}
const time = latestTime(); // Promise { <pending> }

据我所知,await应该是阻塞的,在上面的代码中,它似乎阻塞了返回带有原语时间戳的对象bl。然后,我的函数返回原语值,但是时间变量被设置为挂起的promise,而不是该原语。我错过了什么?


共有3个答案

胥智
2023-03-14

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

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

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

const time = await latestTime();

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

蔺敏达
2023-03-14

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

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

如果您在JavaScript模块的顶层执行此操作,一些环境现在支持模块中即将到来的顶层wait

const time = await latestTime();

JavaScript引擎正在获得对顶级wait的支持,例如,Webpack对它有实验性的支持。

以下是您的async函数在明确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);
    });
}

关于这一点的一些重要说明:

  • 传递给newpromise的函数(Promise executor函数)由newpromise同步调用。
    • 这就是操作开始的原因,web3。埃斯。同步调用getBlock,以开始工作

潘嘉颖
2023-03-14

异步前缀是一种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;
}

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)
        })
}
 类似资料:
  • 问题内容: 我的代码: 当我尝试运行这样的东西时: 我越来越: 但为什么? 我的主要目标是将令牌(从令牌中返回承诺)转换为变量。然后才执行一些操作。 问题答案: 只要其结果尚未解决,promise将始终记录未决。无论promise状态如何(已解决或仍处于待处理状态),您都必须调用promise来捕获结果: 这是为什么? 承诺只是向前的方向;您只能解决一次。a的解析值传递给其或方法。 根据Promi

  • 我的代码: 当我尝试运行这样的东西时: 我得到了: 但为什么? 我的主要目标是将返回承诺的中的token转换为一个变量。然后才预形成一些动作。

  • 我有一个异步函数,它调用其中的另一个异步函数。此异步函数正在返回" 你能帮我解决这个问题吗? 以下是第一个异步函数: 如你所见,我调用updateAllProducts函数,并将该值存储到一个变量调用newAllProducts. updateAllProducts是另一个异步函数。 以下是updateAllProducts的代码: 此updateAllProducts函数正在调用另一个异步函数调

  • 我正在学习react native,我遇到了一个问题。为什么从异步函数返回时获取数据会返回一个promise,但在异步函数本身中,它会正确地返回一个对象数组? 在上,我调用我的异步函数,该函数反过来提取api url: 在,我得到了正确的json对象列表,我可以使用。但后来,返回包含奇数数据的promise: ... 我再也找不到我的json对象了。为什么会这样?更重要的是,如何在中检索json数

  • 我有这个异步函数,并试图返回一个对象或null。 但是我在定义类型时出错了。 如何定义这种数据类型? 类型“ContactId | null”不可分配给类型“string | null” 类型“ContactId”不能分配给类型“string”。

  • 更新 我已经读了十几篇关于这个话题的文章,但没有一篇涉及到这个基本问题。我将在本文末尾列出一个参考资料部分。 原始帖子 我对函数的理解是,它返回一个promise。 MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function 在我的程序中,我可以编写如下内容: 我