2017-10-19 3 views
1
an eine Komponente Eigenschaft zuweisen

IAbonnement nicht ausführt, wenn

this._subscription = Observable.timer(1000).subscribe(() => { 
      console.log('inside timeout') 
     }) 

eine Timeout-Funktion mit rxjs beobachtbaren innerhalb einer angular2 Komponente einzurichten versucht, und es in anderen Verfahren abmelden. Doch die beobachtbaren ausgeführt nie Wenn ich

let _subscription = Observable.timer(1000).subscribe(() => { 
      console.log('inside timeout') 
     }) 
ändern

Es funktioniert gut. Ich versuchte auch mit

this._subscription=setTimeout(()=>{},1000) 

gleiche Sache geschah. Ich vermute, dass es der ngZone-Fehler ist, also verpacke ich die Funktion innerhalb

this._ngZone.runOutsideAngular(() => {}) 

, aber das Ergebnis ist das gleiche. Ist schon einmal jemand auf dasselbe Problem gestoßen? Ich benutze eckig 2.2.4

+3

_and abbestellen es in anderen method_ - zeigen Sie den vollständigen Code. _Seitiges geschah_ - was auch? –

+0

beobachtbar nie ausgeführt. Es wird nur ausgeführt, wenn Sie es keiner Subskriptionsvariable zuweisen oder es einer lokalen Subskriptionsvariablen zuweisen. –

+0

das ist nicht wahr, sobald Sie eine Observable abonnieren, wird es ausgeführt, in Ihrem Fall in 1000 ms sollten Sie die Protokollnachricht sehen ** es sei denn ** Sie abmelden vor der 1000 ms Pass –

Antwort

1

Subskription zu einer Observable sollte (in den meisten Fällen) innerhalb ngOnInit Methode durchgeführt werden.

So, jetzt, wenn Sie von ihm abmelden möchten, können Sie es so tun:

private onDestroy$ = new Subject<void>(); 
private stopObs$ = new Subject<void>(); 

ngOnInit() { 
    someObs$ 
    // stop the observable if the component is being destroyed 
    .takeUntil(this.onDestroy$) 
    // stop the component from another method if you want 
    .takeUntil(this.stopObs$) 
    .do(x => console.log(`A value has been received: ${x}`)) 
    .subscribe(); 
} 

callThisMethodToStopListeningToObs() { 
    this.stopObs$.next(); 
    this.stopObs$.complete(); 
} 

ngOnDestroy() { 
    this.onDestroy$.next(); 
    this.onDestroy$.complete(); 
} 

Hier someObs$ könnte ein interval, ein timer oder was auch immer zu beobachten :).

+0

ya es ist möglich, Ansatz scheint jedoch ein bisschen zu komplex für mein Problem. Ich kann es mit einer lokalen Variable beheben lassen, lassen Sie subs = setTimeout() anstelle von this = setTimeout(), aber ich möchte nur wissen, warum die Zuweisung von Komponenteneigenschaften bricht settimeout –

+0

Ich sehe nicht, wie dies die Frage des Fans anspricht. –

0

Es stellt sich heraus, ich habe eine klare Subskription in onNgInit, um Abonnement nach Komponenteninitialisierung zu löschen.

NgInit wird nach der Komponentenmethode ausgeführt, in der das Observable sitzt. Daher bricht es das Abonnement sofort nach der Erstellung ab. Jetzt habe ich das Abonnement zurückgesetzt, es funktioniert gut. Was ich gelernt habe ist, dass Ihre Komponente Methode von anderen Komponenten aufgerufen werden kann, bevor NgInit Hook passieren