Rxjs - 重新订阅未订阅的Observable

时间:2016-08-15 06:44:04

标签: angular typescript rxjs

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

我也使用了角度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();
      }
   }

我在appcomponent的cunstructor中订阅了PingService。 数据显示在图表中。当我第一次单击该按钮时,它会停止服务,不再有数据更新。当我下次点击时,没有任何反应,尽管“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”。

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

1 个答案:

答案 0 :(得分:5)

由于您使用的是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);

请参阅Configure Required SDKs

相关问题