非返回异步方法

时间:2017-12-30 22:39:17

标签: javascript typescript asynchronous async-await

我使用带有es2017的Typescript作为编译目标,使用Javascript的新async / await

我目前有以下代码从TS服务类中获取一些数据(简化):

class MyClass {

    public static async initialize(): Promise<void> {
        const data = await this.getItems();
        // do unrelated initialization stuff
        return new Promise<void>(() => {});
    }

    private static async getItems(): Promise<Item[]> {
        return await Service.fetchData();
    }
}

class Service {
    public static async fetchData(): Promise<Item[]> {
        // Performs an XHR and returns a Promise.
    }
}

这很有效,但如果MyClass::initialize()没有返回任何东西,而不是返回new Promise<void>(() => {});,那将会更加清晰。但是,这似乎是不可能的,因为任何方法/函数都使用{{1} <}> 必须标记为await,任何标记为async 的方法/函数都必须返回async

有什么方法可以解决这个问题,还是我从根本上没有把握的东西?

1 个答案:

答案 0 :(得分:3)

TypeScript中的异步函数确实需要声明为返回promises,但实际上并不需要从函数返回promise。你可以从异步函数中返回promise值的类型,并且它将被包含在一个promise中。

因此,对于返回Promise<void>的异步函数,您可以只返回空值或根本不返回。

class Item
{
}

class MyClass 
{

    public static async VoidAsyncWithReturn(): Promise<void>
    {
        return;
    }

    public static async VoidAsyncWithoutReturn(): Promise<void>
    {
    }

    private static async AsyncReturningValue(): Promise<Item[]> 
    {
        var result: Item[] = new Array();
        return result;
    }

    private static async AsyncReturningPromise(): Promise<Item[]> 
    {
        var result: Promise<Item[]> = new Promise<Item[]>(() => { return new Array() });
        return result;
    }
}