网站搜索

javascript - 从 `async` 函数返回 `void`


所以我现在遇到过好几次这个情况,我一直都只是忽略它。

在 TypeScript 中,当我编写代码时:

async function someAsyncFunc(): void {
    const prom = await somePromise();
}

它向我抱怨异步函数应该始终具有返回类型:Promise<T>。所以它想让我做的是:

async function someAsyncFunc(): Promise<void>

我知道,但这种方法不会返回任何东西。到目前为止,我总是妥协,并使用类型Promise<void>,但这会导致错误,因为 TypeScript 现在认为这个函数返回一个 Promise,是不是?

在写这个问题的时候我有了一个想法并且测试了一下……结果证明是真的。如果你在想的话,可以看看我自己的答案 :)

错误信息,希望谷歌能索引它:

The return type of an async function or method must be the global Promise<T> type.

答案#1

异步函数被认为是 Promise 范式的扩展。

对于 JavaScript/TypeScript,需要知道特定 函数 的返回 是异步的,因为它返回一个 Promise。这意味着 异步函数 的 返回类型 总是 Promise。然后,你可以将一个值封装到该 Promise 中,这个值可以是 void、number、string、另一个 promise 等。

来自 MDN:

异步函数是一种通过事件循环异步操作的函数,使用隐式 Promise 返回其结果。

此外:

一个异步函数可以包含一个 await 表达式,该表达式会暂停异步函数的执行并等待传入的 Promise 的完成,然后恢复异步函数的执行并返回已解析的值。请记住,await 关键字只在异步函数内部有效。

继续:函数中的 async/await 是语法糖,用于提高代码可读性。

答案#2

在写这个问题的时候,我想到了答案。所以现在我自己来回答,以防有人也在想这个问题。

当你创建一个 async function 时,JavaScript 会隐式地返回一个 Promise(随后将为空)。就像你编写一个普通的 void 函数一样,你不必在结尾处写 return;,它自然会返回。

async function test() {};
// Will return a resolved void promise
// the code snipped result only shows "{}" check it out in
// the browser console and you'll see
console.log(test());