Angular - TypeError:无法读取未定义

时间:2017-09-05 03:33:31

标签: angular google-authentication angular2-observables

在尝试使用Google身份验证解决执行顺序问题时(即等待异步调用完成),我遇到了这个奇怪的错误。如果我不添加.subscribe,一切正常,但我要等到谷歌弹出窗口返回后再继续其他事情。我正在尝试更改“signIn()”以返回一个observable(它曾经没有返回任何内容),我遇到了这个错误:

  

TypeError:无法读取undefined的属性'subscribe'。

订阅发生错误的部分:

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

改变了服务方法:

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);
    }
  }

更新:这是我的版本直接从signIn返回。根据第一个建议:

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;
      });
    }
  }

仅供参考:我之前提出的导致此更改的问题:Angular - waiting for Google authentication to complete

1 个答案:

答案 0 :(得分:1)

从异步调用返回结果将无法按预期工作。您可以更改this._googleAuth分支以直接返回Observable并在map部分执行您想要的操作:

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

参考 Plunker demo