我想知道首选哪条路径,以及为什么用这种方法返回用户的诺言。
因为我有点迷茫,这是最佳实践,还有更好的实践!
有什么我不理解的东西吗?
getUserList(): Promise<User[]> {
return userService.getList();
}
async getUserList(): Promise<User[]> {
return userService.getList();
}
async getUserList(): Promise<User[]> {
return await userService.getList();
}
编辑
我知道它将承诺返回给呼叫者,而呼叫者必须自己管理承诺。
这似乎很奇怪,我认为异步是没有用的,但是我经常看到它...所以这就是问题所在的原因。
在方法中解析了承诺,并且调用方必须使用try-catch来管理错误。当调用方同时管理许多异步调用时,这可能会很有用……而我们想在视图级别上管理错误。
答案 0 :(得分:2)
TL; DR:您的第一个示例是正确的。
getUserList(): Promise<User[]> {
return userService.getList();
}
这是我要使用的方法。由于您没有在方法主体中使用await
,并且假设getList()
返回了一个Promise,因此无需声明方法async
。
async getUserList(): Promise<User[]> {
return userService.getList();
}
所有async
方法隐式返回一个Promise
。请考虑以下内容:
async getNumber() {
return 1;
}
这实际上返回一个Promise<number>
。因此,您的第二个示例注释不正确,并且在三个示例中,这是唯一在功能上不正确的示例。实际上,这是给定类型签名后的样子:
async getUserList(): Promise<Promise<User[]>>
编辑:根据this,如果某个async
方法返回了一个Promise对象,则它不会重新包装在Promise中,因此该示例可能与# 3声明async
在功能上仍然是正确的,尽管这是不必要和令人困惑的。
async getUserList(): Promise<User[]> {
return await userService.getList();
}
这是多余的。您正在await
处理承诺的结果,然后在返回承诺之前将其隐式重新包装为承诺。只有在您await
在函数主体中进行更多操作时,这才真正有用,例如:
async getUserList(): Promise<User[]> {
const someRequiredValue = await userService.someOtherThing();
return await userService.getList(someRequiredValue);
}