2016-08-15 467 views
1

我正在使用服务来每隔2.5秒“ping”我的服务器,从我的服务器返回响应时间。因此我使用observables。Rxjs - 重新订阅取消订阅Observable

我也使用角2和打字稿。

我现在想停止点击按钮上的服务(取消订阅)。这工作得很好!该按钮应该是一个togglebutton,所以如果没有订阅,订阅和其他方式。但重新订阅不起作用!

这里是我的服务:

export class PingService { 
    pingStream: Subject<number> = new Subject<number>(); 
    ping: number = 0; 
    url: string = url.href; 

    constructor(private _http: Http) { 
    Observable.interval(2500) 
     .subscribe((data) => { 
     let timeStart: number = performance.now(); 

     this._http.get(this.url) 
      .subscribe((data) => { 
      let timeEnd: number = performance.now(); 

      let ping: number = timeEnd - timeStart; 
      this.ping = ping; 
      this.pingStream.next(ping); 
      }); 
     }); 
    } 
} 

这里是我的点击功能:

toggleSubscription() { 
     if (this.pingService.pingStream.isUnsubscribed) { 
     this.pingService.pingStream.subscribe(ping => { 
     this.ping = ping; 
     NTWDATA.datasets[0].data.pop(); 
     NTWDATA.datasets[0].data.splice(0, 0, this.ping); 
     }) 
     } 
     else { 
     this.pingService.pingStream.unsubscribe(); 
     } 
    } 

我订阅的PINGSERVICE我appcomponent的cunstructor内。 数据显示在图表中。当我第一次点击按钮时,它停止服务,不再有数据更新。当我点击下一次,没有任何反应,虽然“this.pingService.pingStream.isUnsubscribed”返回true。

我的构造函数:

constructor(private location: Location, 
     private pingService: PingService) { 

      this.pingService.pingStream.subscribe(ping => { 
      this.ping = ping; 
      NTWDATA.datasets[0].data.pop(); 
      NTWDATA.datasets[0].data.splice(0, 0, this.ping); 
      }) 
    } 

我也得到一个错误“ObjectUnsubscribedError”当我点击按钮的第一次。

任何帮助表示赞赏!谢谢!

回答

4

由于您使用RxJS,您不必订阅/取消订阅。只需考虑使用Rx流的另一种方法。这个想法是有2个流maintoggle流,所以他们结合起来,只有当你的toggle流打开时才会触发事件。

var mainStream = Rx.Observable.interval(100).map(() => '.'); 

var toggleStream = Rx.Observable 
       .fromEvent(toggle, 'change') 
       .map(e => e.target.checked); 

var resultStream = toggleStream 
        .filter(x => x === true) 
        .startWith(true) 
        .flatMap(() => mainStream.takeUntil(toggleStream)); 

resultStream.subscribe(x => display.innerText += x); 

sample fiddle

+0

谢谢,这是一个好主意!我没有那么深入rxjs,不会很快注意到这一点。 :)现在我想知道是否可以在Observable.interval中设置不同的值。我希望用户能够设置他们想要的时间间隔。但是,由于可观测值在我的app.component初始化时开始发射数据(我是否正确?),我不太确定这是否可行。 – Faigjaz

+1

@Faigjaz看看这个问题http://stackoverflow.com/questions/34058398/change-interval-settings-of-observable-after-creation –

+0

我会尽力通过它,谢谢! – Faigjaz