[英]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
关键字添加到loadData
并await
内部使用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。 有关更多信息,请参见此处:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.