假设我有一个项目列表,它是根据一个可以在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的元素,然后订阅合并后的观测值。但这看起来是一个非常不可读的方式来完成这样一个基本任务。我想一定有更好的方法,但我找不到。希望你能帮助我
我无法准确判断这样做是否会正确运行,但我会选择将派遣的 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))
);