【问题标题】:Unsubscribing from an observable when another observable is unsubscribed当另一个 observable 被取消订阅时,从 observable 中取消订阅
【发布时间】: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 被销毁时取消订阅,而 Stmt1Stmt2 取消订阅时取消订阅,那么在两者中添加 takeUntil(unsubscribe) 不是更容易吗? unsubscribe = new Subject(),在 ngOnDestroy 上发射

标签: javascript rxjs ngrx rxjs6


【解决方案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))
);

【讨论】:

  • 是的,这会运行,但我会在每次更改后重新订阅商店。在这种情况下这不会有什么坏处,但如果我们想出一个更通用的解决方案,取消订阅可能是不需要的。 (比如说,您有一个 Firebase 商店,它总是会在更新后取消订阅并再次订阅 - 可能会有不需要的网络流量)。
猜你喜欢
  • 2019-03-19
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多