2016-08-15 8 views
1

서비스를 사용하여 2.5 초마다 내 서버에 "핑 (ping)"서비스를 보내고 서버에서 응답 시간을 반환합니다. 그러므로 나는 관찰 대상을 사용하고있다.Rxjs - 구독 취소로 관찰 됨 Observable

나는 각 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); 
      }); 
     }); 
    } 
} 

클릭 내 기능입니다 :

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"입니다.

도움을 주시면 감사하겠습니다. 감사!

답변

4

RxJS를 사용하고 있으므로 가입/탈퇴 할 필요가 없습니다. Rx 스트림을 사용하는 다른 방법을 고려하십시오. 아이디어는 두 개의 스트림 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에 그렇게 멀리 있지 않은 Im는 이것을 언제든지 곧 알아 채지 못했을 것입니다. :) 이제 Observable.interval에 다른 값을 설정할 수 있는지 여부를 알고 싶습니다. 사용자가 원하는대로 간격을 설정할 수 있기를 바랍니다. 그러나 app.component가 초기화되는 즉시 관찰 내용이 데이터를 방출하기 시작하므로 (이것이 맞습니까?) 이것이 가능한지 확실하지 않습니다. – Faigjaz

+1

@ Faigjaz이 질문을보십시오 http://stackoverflow.com/questions/34058398/change-interval-settings-of-observable-after-creation –

+0

감사합니다. – Faigjaz

관련 문제