2017-09-05 5 views
1

Beim Versuch, eine Reihenfolge der Ausführungsprobleme mit der Google-Authentifizierung aufzulösen (d. H. Warten, bis ein Async-Aufruf abgeschlossen wird), ist dieser seltsame Fehler aufgetreten. Alles funktioniert, wenn ich nicht .subscribe hinzufüge, aber ich versuche zu warten, bis das Google-Pop-up-Fenster zurückgekehrt ist, bevor ich mit anderen Dingen fortfahre. Ich versuche, „Signin()“ zu ändern, um eine beobachtbare zurückzukehren (früher nichts zurück), ich habe in diesen Fehler laufen:Angular - TypeError: Eigenschaft 'subscribe' von undefined kann nicht gelesen werden

TypeError: Cannot read property 'subscribe' of undefined.

Abonnieren Teil, wo der Fehler aufgetreten ist:

this._authService.signIn().subscribe(
     value => console.log(value), 
     error => console.error(error), 
    () => console.log("done") 
    ); 

Und die veränderte Service-Methode:

signIn(): Observable<boolean> { 
    const signOptions: gapi.auth2.SigninOptions = {scope: SCOPES }; 
    if (this._googleAuth) 
     Observable.fromPromise(this._googleAuth.signIn(signOptions))  
     .subscribe(response => { 
     var user:any = response; 
     if(response === true) { 
      this.handleSuccessLogin(user); 
      return Observable.of(true); 
     } 
     else { 
      return Observable.of(false); 
     } 
     }); 
    } 
    else { 
     console.error("Google Authentication not initialized"); 
     return Observable.of(false); 
    } 
    } 

Update: Hier ist meine Version direkt von Signin zurück. Gemäß dem ersten Vorschlag:

signIn(): Observable<{}> { 
    const signOptions: gapi.auth2.SigninOptions = {scope: SCOPES }; 
    if (this._googleAuth) { 
     return Observable.fromPromise(this._googleAuth.signIn(signOptions))  
     .map(response => { 
     var user:any = response; 
     if(response === true) { 
      this.handleSuccessLogin(user); 
     } 
     return response; 
     }); 
    } 
    } 

FYI: Meine vorherigen Frage, die zu dieser Änderung geführt: Angular - waiting for Google authentication to complete

Antwort

1

Ergebnisses von einem asynchronen Aufruf Rückkehr wird nicht wie erwartet funktionieren. Sie können die this._googleAuth Zweig ändern, um eine beobachtbare direkt und tun Dinge, die Sie bei map Teil zurück:

return Observable.fromPromise(this._googleAuth.signIn(signOptions))  
     .map(response => { 
      var user:any = response; 
      if(user) { 
      this.handleSuccessLogin(user); 
      return true; 
      } else { 
      return false; 
      } 
     }); 

siehe Plunker demo.

+0

danke und ich schätze das Beispiel. Ich versuche Ihren Vorschlag, aber es gibt überhaupt nichts zurück und der Aufruf von handleSuccessLogin() zündet auch nicht. Siehe mein Update. Habe ich etwas durcheinander gebracht? – beachCode

+0

@beachCode sollten Sie immer noch Ihren anderen Zweig behalten – Pengyy

+0

@beachCode ändern 'signIn(): Observable <{}>' zu 'signIn(): Observable ' und stellen Sie sicher, dass Ihre 'this._googleAuth.signIn (signOptions)' Antwort erhalten kann. – Pengyy

Verwandte Themen