繁体   English   中英

用async \\ await重写基于Promise的代码

[英]Rewrite Promise-based code with async\await

我正在尝试使用async \\ await重写此基于Promise的代码:

public loadData(id: string): void {
    this.loadDataAsync()
        .then((data: any): void => {
             // Do something with data
        })
        .catch((ex): void => {
             // Do something with ex
        });
}

public loadDataAsync(): Promise<any> {
    // return Promise somehow
}

到目前为止,我重写的代码是:

public loadData(id: string): void {
    let data: any;

    try {
        data = await this.loadDataAsync();
    } catch(ex) {
         // Do something with ex
    }

    // Do something with data
}

public async loadDataAsync(): Promise<any> {
    // return Promise somehow
}

问题是我必须使loadData()方法async因为它在主体中等待。 然后,我必须从中返回一些Promise ,因为async方法必须返回Promise 但是我需要维护loadData()方法的API并返回void

我该如何实现? 当内部调用的深层内部调用async方法时,如何满足永无止境地将方法设为async需求?

理想情况下,如果您可以更改函数声明,只需将async关键字添加到loadDataawait内部使用await ,如下所示:

public async loadData(id: string): void {
    let data: any;

    try {
        data = await this.loadDataAsync();
    } catch(ex) {
         // Do something with ex
    }
}

如果您无法更改loadData函数声明,则可以在内部创建一个匿名async函数,然后在匿名函数内调用await ,如下所示:

public loadData(id: string): void {
    let data: any;

    try {
        data = (async () => { return await this.loadDataAsync() })();
    } catch(ex) {
         // Do something with ex
    }
}

public async loadDataAsync(): Promise<any> {
    return new Promise((resolve, reject) => {
        // Logic goes here
        resolve(data);
    });
}

每当使用await关键字时,必须将周围的函数标记为async


正如OP在注释中所指出的那样,在TypeScript中,最好的做法是也用async标记promise返回方法(请参见上面的loadDataAsync函数),因为这可以确保返回类型始终是promise。 有关更多信息,请参见此处:

TypeScript异步/等待教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM