取消订阅另一个可观察对象时退订

时间:2020-05-13 10:06:41

标签: javascript rxjs ngrx rxjs6

假设我有一个列表,这些列表是根据可以在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处于活动状态(而不是销毁),我们就只能订阅Statement 1?我将始终订阅声明2的结果,因此声明1将永远不会退订。

我尝试合并两个可观察变量,并忽略语句1的元素,然后订阅合并的可观察变量。但这似乎是完成这种基本任务的一种非常难以理解的方法。我认为一定有更好的方法,但是我找不到。希望你能帮忙!

1 个答案:

答案 0 :(得分:1)

我无法确切确定它是否可以正确运行,但是我可以将ResultGotAction的调度转移到tap运算符,然后再切换到this.store$.select(selectResults)

例如:

this.store$.select(selectParameter).pipe(
  switchMap(parameter => this.doApiCall$(parameter)),
  tap(apiResult => this.store$.dispatch(new ResultGotAction(apiResult))),
  switchMapTo(this.store$.select(selectResults))
);