一个返回Promise<void>的异步函数在块的末尾是否有隐式返回?

70
public async demo(): Promise<void> {
    // Do some stuff here
    // Doing more stuff
    // ... 
    // End of block without return;
}

在TypeScript/ES6中,在块的结尾处是否会隐式返回一个新的Promise<void>

布尔类型的示例:

class Test {

    public async test(): Promise<boolean> {
        return true;
    }

    public main(): void {

        this.test().then((data: boolean) => {

            console.log(data);

        });

    }

}

new Test().main();

这会在控制台打印出true,因为async函数内部的return会创建一个新的Promise并使用返回的数据调用resolve()。那么对于Promise<void>会发生什么呢?


4
如果你没有显式地加上返回语句,每个 JavaScript/TypeScript 函数在结尾都会自动隐式返回一个值。 - Tesseract
1
@str:当我从异步函数中返回某些内容时,这隐式地返回一个新的Promise实例,并在其上调用.resolve()以返回数据,而在抛出异常时则分别调用.reject()吗? - Gala
3
是的,异步函数始终返回一个Promise。 - Tesseract
一个 Promise<void> 可以像其他 Promise 一样被解决。 - Tesseract
1
我的问题是:当我在一个返回Promise<void>的函数中不返回任何内容,即没有调用returnreturn void时,它会在函数块的末尾隐式调用吗? - Gala
1个回答

80

Promise 发生了什么

返回 void 的函数和 Promise<void> 相同。一个 void 函数返回 undefined。一个 Promise<void> 解决为 undefined

function foo(){}; console.log(foo()); // undefined
async function bar(){}; bar().then(res => console.log(res)); // undefined

1
根据您代码片段中的第二行,当TypeScript编译器看到一个async函数时,Promise<void>是否是默认推断类型? - Paul Razvan Berg
11
如果一个函数是异步的,那么它始终是Promise<something>。 如果该函数是异步的但不返回任何内容,则为Promise<void> - basarat
另一个问题:即使我不调用该方法,异步函数也会执行吗?因为它是一个Promise<void>函数,所以返回什么并不重要,对吧? - Zoey
1
“即使我不调用该方法,异步函数也会执行?” 是的。在这种情况下,您只是忽略了该函数的结果(返回的“Promise”)。无论您是否使用该函数的结果(例如,在返回的“Promise”上调用“then”)都没有关系。 - basarat
@basarat说,如果一个异步函数返回一个对象,但我们在fn定义中没有明确定义其返回类型,TypeScript会假定返回类型是什么?它会是Promise<any>还是仅仅是any或其他什么类型?如果是后者,那么这是否意味着Promises属于any类型? - user7630232
3
它将是Promise<返回对象的推断类型> - basarat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接