当另一个观测值被取消订阅时,取消订阅该观测值。

问题描述 投票:0回答:1

假设我有一个项目列表,它是根据一个可以在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的订阅?我将始终订阅语句2的结果,所以语句1永远不会被取消订阅。

我试过合并两个观测值,忽略语句1的元素,然后订阅合并后的观测值。但这看起来是一个非常不可读的方式来完成这样一个基本任务。我想一定有更好的方法,但我找不到。希望你能帮助我

javascript rxjs ngrx rxjs6
1个回答
1
投票

我无法准确判断这样做是否会正确运行,但我会选择将派遣的 ResultGotActiontap 操作员,然后切换到 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))
);
© www.soinside.com 2019 - 2024. All rights reserved.