【问题标题】:Angular - TypeError: Cannot read property 'subscribe' of undefinedAngular - TypeError:无法读取未定义的属性“订阅”
【发布时间】:2025-12-03 08:05:02
【问题描述】:

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

TypeError:无法读取未定义的属性“订阅”。

订阅发生错误的部分:

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(): 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

【问题讨论】:

    标签: angular google-authentication angular2-observables


    【解决方案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

    【讨论】:

    • 谢谢,我很欣赏这个例子。我正在尝试您的建议,但它根本没有返回任何内容,并且 handleSuccessLogin() 调用也没有触发。看我的更新。我是不是搞砸了什么?
    • @beachCode 你仍然应该保留你的 else 分支
    • @beachCode 将signIn(): Observable&lt;{}&gt; 更改为signIn(): Observable&lt;boolean&gt; 并确保您的this._googleAuth.signIn(signOptions) 可以得到回复。
    • 我实际上是从这个开始的,得到了​​这个错误:类型'Observable' 不能分配给类型'Observable'。类型“{}”不可分配给类型“布尔”
    • @beachCode 遇到此错误,只需将 signIn(): Observable&lt;{}&gt; 更改为 signIn(): Observable&lt;boolean&gt;
    最近更新 更多