未捕获的类型错误:googleAuth.then 不是函数

Posted

技术标签:

【中文标题】未捕获的类型错误:googleAuth.then 不是函数【英文标题】:Uncaught TypeError: googleAuth.then is not a function 【发布时间】:2018-08-10 04:30:01 【问题描述】:

我已经使用 Google 身份验证运行了这个 Angular 5 应用程序一段时间,然后突然出现了这个错误(在 prod 和 dev 上)。登录成功,我得到了一个 GoogleAuth 对象(我可以获取用户详细信息),但随后出现此错误:

Uncaught TypeError: googleAuth.then is not a function

这是代码块。 _googleAuth 是一个调用 init 的服务。

this._googleAuth.getAuth()
      .subscribe(googleAuth => 

        // TODO
        console.log('user signedIn: ', googleAuth.isSignedIn.get()); // this returns true

        const self = this;
        googleAuth.then(function()  // error occurs here
          if (googleAuth.isSignedIn.get()) 
            ...
           
...

我已将类型更新为:

"@types/gapi": "0.0.35", "@types/gapi.auth2": "0.0.47",

这是 getAuth 函数(似乎仍然有效):

public getAuth(): Observable<GoogleAuth> 
        if (!this.GoogleAuth) 
            return this.googleApi.onLoad().mergeMap(() => this.loadGapiAuth());
        
        return Observable.of(this.GoogleAuth);
    

我已经检查了类型,并在那里定义了 GoogleAuth.then。为什么我可以获取 GoogleAuth 对象但不能调用 .then?

GoogleAuth.then 的 Google 文档在这里:https://developers.google.com/identity/sign-in/web/reference#googleauththenoninit-onerror

【问题讨论】:

GoogleAuthpromise? @connexo 在类型化中,GoogleAuth 被定义为单例类。 getAuth() 将 GoogleAuth 对象作为可观察对象返回 gapi.auth2.init(params) 初始化 GoogleAuth 对象。您必须在调用 gapi.auth2.GoogleAuth 的方法之前调用此方法。 developers.google.com/identity/sign-in/web/… @connexo 是的,我在问题中提到了这一点。 getAuth() 调用 init(在 loadGapiAuth() 中),它似乎可以工作,因为我得到了用户详细信息和登录状态。但是, .then 函数(也出现在智能感知中)正在引发错误。很奇怪。 getAuth 的代码看起来不像 javascript 【参考方案1】:

我仍然不清楚为什么现在这会变成一个错误,但我找到了一个可能的解决方案。 TypeScript 包装服务已经在 gapi.auth2.init 之后调用了 .then,所以看起来我调用了它两次。我已经删除了该检查,它似乎正在工作。我仍然需要运行我的测试套件,但到目前为止它看起来很有希望。

【讨论】:

以上是关于未捕获的类型错误:googleAuth.then 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

错误:`未捕获(承诺中)类型错误:无法读取未定义的属性'doc'`

未捕获的类型错误:无法读取未定义的属性“区域”?

未捕获的类型错误未定义不是函数

未捕获的类型错误:无法读取未定义的属性 toLowerCase

JQuery:未捕获的类型错误:无法读取未定义的属性“调用”

未捕获的类型错误:无法读取文本字段上未定义错误的属性“toLowerCase”