RxJS处理承诺拒绝

时间:2020-09-17 09:05:45

标签: rxjs nestjs

我有一个数据库查询电话,例如getUserByIdOrThrow(id: number): User; 在getUserByIdOrThrow调用之后,如何正确处理可能的promise拒绝? 如果发生错误,我需要完全忽略它,但是如果Promise成功解决,则需要调用另一个异步函数。

示例流程:

         DBCallAsync
       /            \
    resolved       rejected
     /                \
 another call       do nothing

我尝试解决此问题的方式(未按预期工作):

from(this.dbService.getUserByIdOrThrow(100)).pipe(
  tap(({ phone }) => {
    from(this.userService.sendMessage(phone, "hello")).pipe(
      catchError((err) => {
        // doesnt catches
        return EMPTY;
      }),
    )
  }),
catchError((err) => {
  // doesnt catches
  return EMPTY;
}));

我该如何以正确的方式实现这一目标?

1 个答案:

答案 0 :(得分:1)

由于两个函数都返回Promise,所以我不建议您使用Observable,因此以Promise方式处理它会更好:

try {
  const { phone } = await this.dbService.getUserByIdOrThrow(100);
  await this.userService.sendMessage(phone, "hello"))
} catch (error) {

}

或者如果您坚持使用RXJS样式,则使用{switchMap运算符用于返回和变平内部可观察到的内容,此外,无需在from内使用switchMap,因为它可以处理承诺)

from(this.dbService.getUserByIdOrThrow(100))
  .pipe(
    switchMap(({ phone }) => this.userService.sendMessage(phone, "hello")),
    catchError((err) => EMPTY)
   );