假设我有一个列表,这些列表是根据可以在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的元素,然后订阅合并的可观察变量。但这似乎是完成这种基本任务的一种非常难以理解的方法。我认为一定有更好的方法,但是我找不到。希望你能帮忙!
答案 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))
);