Javascript 非返回异步方法
我使用带有es2017的Typescript作为编译目标,使用Javascript新的Javascript 非返回异步方法,javascript,typescript,asynchronous,async-await,Javascript,Typescript,Asynchronous,Async Await,我使用带有es2017的Typescript作为编译目标,使用Javascript新的async/await 我目前有以下代码从TS服务类(简化)获取一些数据: class-MyClass{ 公共静态异步初始化():承诺{ const data=wait this.getItems(); //做不相关的初始化工作 返回新承诺(()=>{}); } 私有静态异步getItems():承诺{ return wait Service.fetchData(); } } 班级服务{ 公共静态异步fetch
async
/await
我目前有以下代码从TS服务类(简化)获取一些数据:
class-MyClass{
公共静态异步初始化():承诺{
const data=wait this.getItems();
//做不相关的初始化工作
返回新承诺(()=>{});
}
私有静态异步getItems():承诺{
return wait Service.fetchData();
}
}
班级服务{
公共静态异步fetchData():承诺{
//执行XHR并返回承诺。
}
}
这是可行的,但是如果MyClass::initialize()
没有返回任何内容,而不是返回newpromise(()=>{})
然而,这似乎是不可能的,因为任何使用Wait
的方法/函数必须标记为async
,而任何标记为async
的方法/函数必须返回一个承诺
有没有办法解决这个问题,或者我根本没有掌握什么?TypeScript中的异步函数确实需要声明为返回承诺,但实际上不需要从函数返回承诺。您只需从异步函数返回承诺值的类型,它将被包装在承诺中
因此,对于返回承诺的异步函数,您可以只返回空返回或根本不返回
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;
}
}
类项目
{
}
类MyClass
{
公共静态异步VoidAsyncWithReturn():承诺
{
返回;
}
公共静态异步VoidAsyncWithoutReturn():承诺
{
}
私有静态异步AsyncReturningValue():承诺
{
变量结果:项[]=新数组();
返回结果;
}
私有静态异步AsyncReturningPromise():Promise
{
var结果:Promise=newpromise(()=>{returnnewarray()});
返回结果;
}
}
“必须返回承诺”不适用于js。JavaScriptasync
函数自动返回承诺,函数的返回值(不一定是承诺)解析调用函数时返回的承诺。Typescript不同吗?您不应该编写只有静态方法的类
。改为使用对象文字。看看@Bergi为什么会这样?@Niek aclass
只应在需要实例化对象时使用。否则,它效率低下(而且令人困惑)。对象文本更简单。这给了我一个错误异步函数或方法的返回类型必须是MyClass::getItems()
和Service::fetchData()
方法中的全局承诺类型。@Niek抱歉,我弄错了。我已经更正了答案。
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;
}
}