如何停止通过可观察运算符(如debounceTime和switchMap)进行异步验证的Observable.timer

时间:2017-03-06 08:53:29

标签: angular rxjs

当我从该页面导航到另一个页面时,我需要停止Observable.timer。 下面是我在项目中使用的代码。

import { Component, ChangeDetectorRef, OnDestroy } from '@angular/core';
import { NavController, MenuController } from 'ionic-angular';
import {Observable, Subject}from 'RxJs/Rx';

export class SettingsPage extends BasePage implements OnDestroy {
ionViewDidLoad() {
let initial: boolean = true;

this.serverUrlStream
        .debounce((val)=> Observable.timer(initial ? 0 : 500))  
        .switchMap(val => {     
                this.canLeave = false;  
                this.apiClientService.ocServiceUrl = val;
                return Observable.fromPromise(this.apiClientService.getHospitals());
        })
        .catch((err, caught)=>{
            console.log(err);
            return caught;  // Continue after error
        })
        .subscribe((hospitals: Hospital[]) => {
            this.hospitals = hospitals;
            if (hospitals.length > 0) {
                this.settings.hospitalInstallId = hospitals[0].InstallId;
                this.canLeave = true;                   
                this.cd.detectChanges();
            }
        });


    this.serverUrlStream.next(this.settings.serverUrl);
    initial = false;
}
//I tried like below to stop the timer when I left from this page.

ngOnDestroy(){
this.serverUrlStream.unsubscribe();
}

}

以上代码无效仍然ajax调用每5秒运行一次。任何人都可以帮助我在用户离开当前页面时停止Observable.timer

1 个答案:

答案 0 :(得分:1)

您在ngOnDestroy取消订阅的方法是正确的。你的语法略有错误。

首先需要将实际订阅分配给变量,如下所示 this.serverUrlSubscription = this.serverUrlStream.debounce(...)...subscribe(...);

您应该首先将serverUrlSubscription: Subscription;声明为您班级的成员(Subscription类型可以从rxjs/Subscription导入。)

然后,您只需在this.serverUrlSubscription.unsubscribe();中执行ngOnDestroy即可分离并销毁订阅

第二种方法是在takeUntil(this.router.events.filter((event) => event instanceof NavigationStart)运算符之后使用switchMap,首先必须将角度路由器注入this.router

但我建议您使用ngOnDestroy