angular - 倍增订阅
问题描述
在一个组件中,我有两个订阅,一个用于查询参数,一个用于 http GET 请求。在此页面上,用户还可以选择在不同类型的数据之间切换(只能显示一种类型)。当用户点击一个选项时,查询参数更新,订阅更新,所以再次调用http GET请求,数据也更新,如下:
constructor(private service: DataService, private route: ActivatedRoute) {}
ngOnInit() {
this.route.queryParams.subscribe(params => {
this.dataType = params["dataType"];
this.service
.getData(this.dataType)
.subscribe(data => {
this.data=data;
})
})
}
在 html 中:
[queryParams]="{ dataType: row.dataType}"
问题是,每次用户单击不同类型的数据时,都会从 http GET 请求创建新订阅,因为一切都发生在同一个组件中。因此,当组件创建时:2 个订阅,用户点击新数据类型:新数据加载和 3 个订阅,用户点击不同的数据类型,新数据加载和 4 个订阅等等。正如您可以想象的那样,在点击 4-5 次后,页面就会崩溃。
我一直在尝试为这个问题找到解决方案(特别是根据用户的选择在同一组件中加载数据),但我不知道该怎么做。任何帮助,将不胜感激
解决方案
一些 RxJS 管道操作符应该可以解决这个问题:
switchMap
- 将取消之前的http请求并切换到最新的
使用takeUntil
方法来取消订阅
tap
副作用(在订阅中不这样做有点难看)
ngOnInit() {
this.route.queryParams.pipe(
map(params => params["dataType"]),
tap(dataType => {
this.dataType = dataType
}),
switchMap(dataType => this.service.getData(this.dataType)),
takeUntil(this.destroyed$)
).subscribe(data => {
this.data = data;
})
}
编辑- make takeUntil 最后一个运算符!
推荐阅读
- google-admin-sdk - 创建名称/描述中包含特殊字符的组时出现 400 和“无效输入:groupDescription”
- spring-cloud - 在浏览器中获取 Eureka 实例元数据
- python - 我知道这是基本的,但我是 Python 的新手。我正在使用 Python 3 和我的编码问题我无法让打印功能与输入一起使用
- python - 如何使用 Kubernetes Python CoreV1API 删除 statefulsets.apps
- pine-script - 如何为交易视图上的策略执行设置自定义时间过滤器
- ruby - Ruby 二进制搜索代码未返回预期结果
- java - 与 Binance 不同的 EMA(指数移动平均线)
- python - 如何使用 Python 中的键访问 JSON 字符串中的值?
- python - 无法使用 rmtree 擦除目录,因为它正在被另一个进程使用
- julia - 如何使用多个数组图制作 GIF?