首页 > 解决方案 > RxJS 处理承诺拒绝

问题描述

我有一个数据库查询调用,例如getUserByIdOrThrow(id: number): User;通话后如何正确处理可能的承诺拒绝getUserByIdOrThrow?如果出现错误,我需要完全忽略它,但如果 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;
}));

我怎样才能以正确的方式实现这一点?

标签: rxjsnestjs

解决方案


由于这两个函数都返回 Promise,我不建议使用 Observable,你最好以 Promise 的方式处理它:

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

}

或者如果您坚持使用 RXJS 样式(switchMap运算符用于返回和扁平化内部可观察对象,另外不需要使用from内部,switchMap因为它可以处理 Promises)

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

推荐阅读