我有一个数据库查询电话,例如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;
}));
我该如何以正确的方式实现这一目标?
答案 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)
);