2016-07-17 5 views
0

Ich habe einen EventEmitter, der einen Benutzer darüber informiert, dass eine Komponente benachrichtigt wird, dass sich der Status der Anwendung geändert hat.Angular2 EventEmitter wird nach dem Aufruf von .error nicht abgeschlossen

Dieses Ereignis informiert darüber, ob ein Benutzer, der versucht, sich zu authentifizieren, erfolgreich war.

private emitAuthStatus(success: boolean) { 
    if (success) { 
     this.locationWatcher.emit({ 
      authenticated: this.authenticated, 
      token: this._authData.token, 
      expires: this.expires 
     }); 
    } else { 
     this.locationWatcher.error(); 
    } 

    this.locationWatcher.complete(); 
} 

Nun, wenn ich rufe .emit von .complete alles gefolgt richtig funktioniert. Aber wenn ich .error anrufen, wirft die .complete eine ObjectUnsubscribedError.

Was ist .error für bestimmt und was mache ich falsch in diesem Code?

+2

Aber warum rufen Sie error() und complete() hier? Sie sollten sie dort aufrufen/verwenden, wo Sie "locationWatcher observer" in der Komponente abonniert haben. – micronyks

+0

Bedeutet ein Fehler, dass etwas mit dem Ereignis schief gelaufen ist oder dass das Ereignis eine besondere Art von Ereignis auslöst? Wenn ich mir die Dokumentation anschaue, scheint es eine besondere Art von Ereignissen auszulösen, aber sicherlich sollte das nicht bedeuten, dass der 'EventEmitter' nicht mehr abonniert ist. – Linvi

+1

Ich glaube nicht, dass 'error()' und 'complete()' überhaupt verwendet werden sollen. 'EventEmitter' erweitert derzeit' Observable', aber das ist ein Implementierungsdetail und es wird erwartet, dass es sich jederzeit ohne eine Phase der Verfallphase ändert. Verwenden Sie 'EventEmitter' nur für' @Output() 'nur in Komponenten und verwenden Sie nur die Methode' emit() '. –

Antwort

0

Ich habe meinen Code geändert, um keine .error und .complete zu verwenden, die nicht dazu gedacht sind, Informationen weiterzuleiten.

private emitAuthStatus() { 
    this.locationWatcher.emit({ 
     // The .authenticated allow us to know if the EventEmitter is a success 
     authenticated: this.authenticated, 
     token: this._authData.token, 
     expires: this.expires 
    }); 
} 
Verwandte Themen