我使用带有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
。
有什么方法可以解决这个问题,还是我从根本上没有把握的东西?
答案 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;
}
}