【发布时间】:2020-08-29 11:28:11
【问题描述】:
假设我有一个根据可以在 UI 中更改的参数从 API 查询的项目列表。当改变这个参数的值时,我调度了一个动作:
this.store$.dispatch(new ChangeParameterAction(newParameterValue));
现在,在接收端,我想在每次参数更改时触发一个新的 API 调用。我通过订阅商店然后切换到可观察的 API 来做到这一点。然后,我将结果发送回商店:
/** Statement 1 **/
this.store$.select(selectParameter).pipe(
switchMap(parameter => this.doApiCall$(parameter))
).subscribe(apiResult => {
this.store$.dispatch(new ResultGotAction(apiResult))
});
我的 UI 正在通过订阅接收项目
/** Statement 2 **/
this.store$.select(selectResults);
现在我的问题是:我如何才能将这两个语句连接在一起,以便只要显示结果的 UI 处于活动状态(而不是破坏),我们就只有对语句 1 的订阅?我会一直订阅 Statement 2 的结果,所以 Statement 1 永远不会被取消订阅。
我尝试合并两个 observables 并忽略 Statement 1 的元素,然后订阅合并的 observables。但这看起来像是一种非常难以理解的方式来完成这样一个基本任务。我想一定有更好的方法,但我找不到。希望你能帮忙!
【问题讨论】:
-
什么决定了
as long as my UI is actually interested in the results? -
在 Angular 中,我会订阅
| async。如果视图被销毁,它会自动取消订阅。重新表述了问题。 -
那么您要找的是:当
Stmt2退订时,如何退订Stmt1,对吧? -
是的,正是:)
-
那么,如果
Stmt2在 comp 被销毁时取消订阅,而Stmt1在Stmt2取消订阅时取消订阅,那么在两者中添加takeUntil(unsubscribe)不是更容易吗?unsubscribe = new Subject(),在ngOnDestroy上发射
标签: javascript rxjs ngrx rxjs6