返回异步承诺(TypeScript)的最佳做法

时间:2018-10-23 18:02:58

标签: typescript es6-promise

我想知道首选哪条路径,以及为什么用这种方法返回用户的诺言。

因为我有点迷茫,这是最佳实践,还有更好的实践!

有什么我不理解的东西吗?

1

getUserList(): Promise<User[]> {
    return userService.getList();
}

2

async getUserList(): Promise<User[]> {
    return userService.getList();
}

3

async getUserList(): Promise<User[]> {
    return await userService.getList();
}

编辑

1

我知道它将承诺返回给呼叫者,而呼叫者必须自己管理承诺。

2

这似乎很奇怪,我认为异步是没有用的,但是我经常看到它...所以这就是问题所在的原因。

3

在方法中解析了承诺,并且调用方必须使用try-catch来管理错误。当调用方同时管理许多异步调用时,这可能会很有用……而我们想在视图级别上管理错误。

1 个答案:

答案 0 :(得分:2)

TL; DR:您的第一个示例是正确的。

1

getUserList(): Promise<User[]> {
    return userService.getList();
}

这是我要使用的方法。由于您没有在方法主体中使用await,并且假设getList()返回了一个Promise,因此无需声明方法async

2

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在功能上仍然是正确的,尽管这是不必要和令人困惑的。

3

async getUserList(): Promise<User[]> {
    return await userService.getList();
}

这是多余的。您正在await处理承诺的结果,然后在返回承诺之前将其隐式重新包装为承诺。只有在您await在函数主体中进行更多操作时,这才真正有用,例如:

async getUserList(): Promise<User[]> {
    const someRequiredValue = await userService.someOtherThing();
    return await userService.getList(someRequiredValue);
}