取消订阅Observable停止http通话

时间:2019-04-12 05:58:19

标签: angular rxjs rxjs6

我遇到了一个问题。不知道它是否按预期工作。

  startTimerSubscription(){
    this.timerSubscription.unsubscribe();
    let subscription = this._testService.getTimerData().subscribe((response) => {
      console.log(response);
    });
    this.timerSubscription.add(subscription);
  }

每当我调用该函数时,就永远不会订阅数据。即没有控制台打印数据。

我的测试服务将getTimerData()定义为:

getTimerData(){
    return timer(0,10000).pipe(switchMap(()=> {
      return of(this.testData);
    }));
  }

有人可以向我解释这种行为吗?在订阅数据之前,我要取消订阅数据。难道不应该每10秒记录一次数据吗?

我尝试使用interval运算符,结果是相同的。

我还创建了一个stackblitz example

预先感谢

2 个答案:

答案 0 :(得分:2)

问题在于,您在添加.unsubscribe()的任何订阅之前正在呼叫.add()

调用.unsubscribe()时,它会将Subscription对象标记为“已关闭”,而当您尝试添加任何其他订阅时,它也会取消订阅该对象,因为“父”订阅已经“处于Closed”状态。

因此,您将不会看到任何控制台输出,因为timer()是异步发出的,实际上您在它发出任何内容之前都已取消订阅。相反,startWith运算符在订阅时立即发出。

这些是特定的行

答案 1 :(得分:1)

您不会在订阅上使用add。这是working solution

我没有使用add方法,而是简单地将预订分配给您的班级成员。

this.timerSubscription.unsubscribe();
this.timerSubscription = this._testService.getTimerData().subscribe((response) => {
  console.log(response);
});

------

this.intervalSubscription.unsubscribe();
this.intervalSubscription = this._testService.getIntervalData().subscribe((response) => {
  console.log(response);
});

add方法获取TearDownLogic,该方法将在订阅被销毁时使用。例如,您可能要用此销毁其他Subscription个,因此可以添加它。

  

add(teardown:TeardownLogic):订阅

     

添加一个拆解,以在此的unsubscribe()期间调用   订阅。

有关更多信息,请检查docs