Rxjs-重新订阅未订阅的Observable

Fai*_*jaz 4 rxjs typescript angular

我正在使用服务每2.5秒“ ping”我的服务器,并从我的服务器返回响应时间。因此,我正在使用观测值。

我也使用angular 2和打字稿。

现在,我想在单击按钮时停止该服务(退订)。这样很好!该按钮应该是一个切换按钮,因此,如果未订阅,请进行订阅以及其他方式。但是重新订阅是行不通的!

这是我的服务:

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);
          });
      });
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我点击的功能:

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();
      }
   }
Run Code Online (Sandbox Code Playgroud)

我正在我的appcomponent的构造函数内订阅PingService。数据显示在图表中。当我第一次单击该按钮时,它将停止该服务,不再有数据更新。下次单击时,什么都没有发生,尽管“ this.pingService.pingStream.isUnsubscribescribed”返回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);
          })
   }
Run Code Online (Sandbox Code Playgroud)

当我第一次单击该按钮时,还会出现错误“ ObjectUnsubscribedError”。

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

Max*_*din 5

由于您使用的是RxJS,因此无需订阅/取消订阅。只需考虑使用Rx流的另一种方法。这个想法是有2个流main和一个toggle流,因此结合起来,它们仅在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);
Run Code Online (Sandbox Code Playgroud)

参见小提琴样本

  • @Faigjaz 看看这个问题 http://stackoverflow.com/questions/34058398/change-interval-settings-of-observable-after-creation (2认同)