首页 文章

Rxjs - 重新订阅未订阅的Observable

提问于
浏览
3

我每隔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 回答

  • 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

相关问题