我正在使用带有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>(() => {});
会更加清洁但是,这似乎是不可能的,因为任何使用await
的方法/函数都必须标记为async
,并且任何方法/函数都是标记为async
必须返回promise
。
有什么方法可以解决这个问题,还是有什么东西我从根本上没有抓住?
需要声明TypeScript中的异步函数以返回promise,但实际上并不需要从函数返回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;
}
}