rxjs - 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;
}));
我怎样才能以正确的方式实现这一点?
解决方案
由于这两个函数都返回 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)
);
推荐阅读
- react-native - 测试包含 AppLoading 组件的应用
- python-3.x - 如何利用linux中所有cpu核心执行python代码
- java - 无法在会话中解析 TextMessage payload=[{"id" :1}], byteCount=9, last=true] 向客户端发送 STOMP ERROR
- python - k8s中如何为前端和后端应用程序之间的连接指定depends_on
- django - Pillow 安装正确,但 Image Field 出错 Pillow is not installed - Django
- python - 在第一次匹配时停止搜索,在 +900 个文件夹 PYTHON 的文件夹中
- c# - 在 IIS 上部署 ASP.NET MVC 应用程序后出现空白页
- java - 删除项目时JavaFX TableView自定义单元格颜色故障
- model-view-controller - 我无法在 grails 中显示来自不同域的数据
- java - 如何上传视频到解析服务器?