Angular 2:无法读取未定义的属性'unsubscribe'

时间:2017-01-27 20:31:51

标签: angular rxjs observable

我正在尝试创建一个可以达到某个数字的ObservableTimer。我已经有了这样做的逻辑,但是当我尝试取消订阅时,我收到了"Cannot read property 'unsubscribe' of undefined"错误。 这是我的代码

syncExpireTime() {
    let route = AppSettings.API_ENDPOINT + 'Account/ExpireTime'
    this.http.get(route, this.options).map(this.extractData).catch(this.handleError).subscribe(
        res => {this.expireTime = +res},
        error => console.log(error),
        () => this.timerSub = TimerObservable.create(0,1000)
            .takeWhile(x => x <= this.expireTime)
            .subscribe(x => x == this.expireTime ? this.logout() : console.log(x))
    )
}

然后这是我的退出代码。我在注销

时试图取消订阅过期计时器
logout() {
    this.timerSub.unsubscribe()
    this.router.navigate(['./login'])
}

3 个答案:

答案 0 :(得分:11)

有两种方法可以尝试解决此问题。

logout() {
    if(this.timerSub){// this if will detect undefined issue of timersub
       this.timerSub.unsubscribe();
      } 
    this.router.navigate(['./login'])
}

或者你可以尝试ngOnDestroy角度2的生命周期钩子,当我们想要破坏我们的组件时用来做事情

ngOnDestroy() {
    if(this.timerSub){
       this.timerSub.unsubscribe();
      } 
    this.router.navigate(['./login']); 
 }

我希望这会有所帮助:)

答案 1 :(得分:3)

我遇到了同样的例外。在调用unsubscribe()之前,最好检查&#34; subscription.closed == false&#34;。

ngOnDestroy(){

java.lang.NoSuchMethodException: setMobileDataEnabled [boolean]

答案 2 :(得分:1)

您应该在unsubscribe中致电ngOnDestroy

  

Lyfecicle Hooks

     

ngOnDestroy

     

在Angular破坏指令/组件之前进行清理。   取消订阅observable并分离事件处理程序以避免记忆   泄漏。

     

在Angular破坏指令/组件之前调用。