2017-12-26 13 views
1

Ich habe diesen Code in einer Komponente, was sehe ich in der Konsole ist diese Nachricht: 'von Komponente 1: Mission gestartet'. Es wird also die Antwort korrekt vom Dienst empfangen, aber nach dem Abschluss möchte ich die Nachricht 'sucessed !!' und das passiert nie ... Wie kann ich etwas tun, wenn die subscribe() abgeschlossen ist?Etwas tun, wenn subscribe() abschließt

onClick() {  
    this.service.announceMission('mission started'); 
    this.service.missionAnnounced$.subscribe(response => console.log('from component 1: ' + response), 
     error => console.log('error: ', error), 
     () => console.log('successed!!')); 
} 

Und das ist der Code, den ich in meinem Dienst haben:

export class MissionService { 
    // Observable string sources 
    private missionAnnouncedSource = new BehaviorSubject("not started yet"); 
    private missionConfirmedSource = new BehaviorSubject("not started yet"); 

    // Observable string streams 
    missionAnnounced$ = this.missionAnnouncedSource.asObservable(); 
    missionConfirmed$ = this.missionConfirmedSource.asObservable(); 
    // Service message commands 
    announceMission(mission: string) { 
     this.missionAnnouncedSource.next(mission); 
    } 
    confirmMission(astronaut: string) { 
     this.missionConfirmedSource.next(astronaut); 
    } 
} 

Antwort

3

Eine beobachtbare nicht abgeschlossen, bis Sie so sagen.

const mySource = new Subject<string>(); 

mySource.subscribe(
    (value: string) => {console.log('value: ', value)}, 
    (error: any) => {console.error(error)}, 
() => {console.log('completed')}, 
); 

mySource.next('a'); 
mySource.next('b'); 
mySource.next('c'); 
subject.complete(); 
mySource.next('d'); 

Mit Ausgabe:

value: a 
value: b 
value: c 
completed 

Die d wird nicht nach Abschluss geschrieben werden.

Für Ihren Fall sollten Sie eine completeMission() Funktion hinzufügen, die Ihre Ausgangsthemen vervollständigt.

completeMission() { 
    this.missionAnnouncedSource.complete(); 
    this.missionConfirmedSource.complete(); 
} 

und nennen Sie es, wenn Sie wan't

onOtherClick() {  
    this.service.completeMission(); 
} 
Verwandte Themen