javascript - 从服务返回订阅 - 但如何在服务中使用异步结果?
问题描述
抱歉标题不好,我真的不知道如何表达它。
假设我在 Angular 组件的某处有一个服务调用,例如:
this.myService.postObject(object).subscribe((serverData) => {
console.log('Server Name:' + serverData.name)
});
当 MyService 看起来像这样时,这当然可以完美地工作:
postObject(dataObject: MyObject) {
return this.http.post(`http://server/object`, dataObject);
}
但是,当我想对异步结果做出反应时,不仅要单独在订阅中,而且还要对所有调用做出反应——理想情况下是这样的:
postObject(dataObject: MyObject) {
return this.http.post(`http://server/object`, dataObject)
.subscribe(
(serverData) => {
console.log('Server Name:' + serverData.name)
})
}
这当然不起作用,因为我无法返回 .subscribe 然后 .subscribe 再次返回它。
但我想到了在帖子执行时需要完成的日志记录、消息传递和其他一般活动。
有没有办法实现这一点,或者我只是盲目地看到?:-(
解决方案
这就是tap的用途,tap 不会修改您返回的 observable,但可以处理诸如日志记录之类的事情。如果要修改返回的 Obsertvable,请改用map
postObject(dataObject: MyObject) {
return this.http.post(`http://server/object`, dataObject)
.pipe(tap(serverData => {
console.log('Server Name:' + serverData.name)
}))
}
RxJS tap 操作符(如“窃听”)让代码检查通过 observable 的正确和错误值,而不会干扰它们。
推荐阅读
- assembly - 用于虚拟到物理地址转换的 FreeBSD 模块
- microsoft-graph-api - 从 Azure 数据工厂管道调用 MS Graph API
- node.js - 如何处理停止发送数据的 HTTP 请求
- ruby-on-rails - 如何在 RoR 中锁定记录
- python - 试图弄清楚如何传递函数,以便它可以显示值
- database - 保存用户是否在 MongoDB 中做过某事的条件:我应该使用哪种字段类型?
- javascript - 为页面上多种类型的元素添加监听器和值
- spring - 在 Feign 客户端中设置 cookie
- go - go env 显示 GOPATH 不匹配
- javascript - 如何在 react.js 中传递数据/值名称