【问题标题】:Return Promise in async function in JavaScript (es2017) [duplicate]在 JavaScript 中的异步函数中返回 Promise(es2017)[重复]
【发布时间】:2020-10-13 15:05:01
【问题描述】:

我想知道 ES2017 或更高版本中以下 2 个函数之间是否存在语义差异:

async function returnBool() {
    const promise = new Promise(((res, rej) => {
        setTimeout(() => {
            res(true);
        }, 1000);
    }));
    // returns a boolean
    return await promise;
}

async function returnPromise() {
    const promise = new Promise(((res, rej) => {
        setTimeout(() => {
            res(true);
        }, 1000);
    }));
    // returns a boolean wrapped in a promise
    return promise;
}

我在 Node 上测试了这两个版本,它们的行为似乎相同。但是,我正在寻找一些保证,即两个版本在语法和语义上都是正确的。

在 C# 等语言中,在 async 方法中声明的返回类型 (Task<TResult>) 与正文中的实际返回类型 (TResult) 之间总是存在差异。从上面的例子来看,在Javascript中似乎不是这样?这是否表明 JS 缺乏严谨性?如果我想从异步方法返回 Promise<Promise<T>> 怎么办? (不太可能,但仍然)

如果有人能指出一些文档或语言标准来澄清这一点,那就太好了。谢谢!

【问题讨论】:

  • async 函数总是返回一个承诺。 async 函数和返回 promise 的函数在功能上没有区别。 async 唯一允许你做的就是使用 await。所以使用第二个实现并删除async
  • 使用返回承诺。
  • 乔什·威尔逊是的,它是重复的
  • "如果我想从异步方法返回 Promise<Promise<T>> 怎么办?" 这对于 Promise 来说是不可能的,因为它们会自动递归地展平/加入。如果你有new Promise(res1 => res1(new Promise(res2 => res2(42) ))),那只是一个最终产生42 的单一级别承诺。在许多情况下,这很好,但它是否完全正确might be up for debate。优点是链接的一些简单性。缺点是有时您可能想要更高级的东西。

标签: javascript async-await ecmascript-2017


【解决方案1】:

async 函数总是返回 Promise。如果您返回的值本身不是Promise,它将被包装在Promise 中,并且Promise 将从async 函数返回。

在第二个代码示例中,您明确返回 Promise,这是不必要的,因为如上所述,async 函数总是返回 Promise

【讨论】:

    猜你喜欢
    • 2019-10-23
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 2018-07-09
    • 2020-07-09
    • 2017-10-16
    • 1970-01-01
    相关资源
    最近更新 更多