Javascript 使用async\await重写基于承诺的代码

Javascript 使用async\await重写基于承诺的代码,javascript,typescript,Javascript,Typescript,我正在尝试使用async\wait重写基于Promise的代码: public loadData(id: string): void { this.loadDataAsync() .then((data: any): void => { // Do something with data }) .catch((ex): void => { // Do something wit

我正在尝试使用
async
\
wait
重写基于
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{
这是loadDataAsync()
.然后((数据:任意):void=>{
//处理数据
})
.catch((ex):void=>{
//和前男友做点什么
});
}
public loadDataAsync():承诺{
//还愿
}
到目前为止,我已经重写的代码是:

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
}
public loadData(id:string):void{
让数据:任何;
试一试{
data=wait this.loadDataAsync();
}捕获(ex){
//和前男友做点什么
}
//处理数据
}
公共异步loadDataAsync():承诺{
//还愿
}
问题是我必须使
loadData()
method
async
,因为它已经在它的主体中等待了。然后,我必须从中返回一些
Promise
,因为
async
方法必须返回
Promise
。但是我需要维护
loadData()
方法的API并返回
void


我怎样才能做到这一点?当您在调用
async
方法时,如何打破将方法设置为
async
的永无止境的需要?

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

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

    try {
        data = await this.loadDataAsync();
    } catch(ex) {
         // Do something with ex
    }
}
如果无法更改
loadData
函数声明,则只需在内部创建一个匿名
async
函数,然后在匿名函数中调用
wait
,如下所示:

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);
    });
}
public loadData(id:string):void{
让数据:任何;
试一试{
data=(async()=>{return wait this.loadDataAsync()})();
}捕获(ex){
//和前男友做点什么
}
}

public async loadDataAsync():Promise

异步方法自动返回一个Promise。在async方法内返回任何您想要的值,该值将用于回调,这意味着您返回的不是函数实际返回的值。
public async loadDataAsync():Promise{
没有意义。请使用
public async loadDataAsync():any{
public loadDataAsync():Promise{
但不是
async
Promise
@PatrickEvans:
async
方法隐式返回
Promise
,TypeScript要求您为此类方法签名指定。这就是我所说的
我必须从中返回一些承诺,因为异步方法必须返回承诺。
@599644:Yo你不能在TS.Check中指定
any
作为
async
方法的返回值类型。关于你的语句
你只在调用wait时使用async,而不是在promise方法上。你能解释一下为什么有一个TS Lint
promise函数async
确保所有方法都返回
promise
mu吗st be
async
?从这条规则的存在及其基本原理来看,人们可能认为用
async
标记所有
Promise
-返回方法是一种很好的做法。@AlexanderAbakumov感谢您指出这一点,我更新了我的答案以反映这一点!