我遇到了一个问题。不知道它是否按预期工作。
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
预先感谢
答案 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