4

我正在使用 Google API (gapi) 进行用户登录。

我的代码如下。它异步加载 google sdk。加载后,我需要调用 api 函数gapi.auth.authorize

(function(d: any, s: string, id: string) {
    var js: HTMLScriptElement, gjs: Element = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = "https://apis.google.com/js/client.js";
    gjs.parentNode.insertBefore(js, gjs);

    if (js.readyState){  //IE
        js.onreadystatechange = function(){
            if (js.readyState == "loaded" ||
                js.readyState == "complete"){
                js.onreadystatechange = null;
                gapi.auth.authorize();   //<-- details omitted 
            }
        };
    } else {  //Others
        js.onload = function(){
            gapi.auth.authorize();   //<-- details omitted 
        };
    }
}(document, 'script', 'google-jssdk'));

现在的问题是 - 我得到错误

类型错误:gapi.auth 未定义

应该定义吧?我看着控制台,输入gapi.auth了一个对象作为响应。

因此,我相信该js.onload事件会提前触发,即何时gapi.auth尚未准备好。

如何解决这个问题?或者更具体地说,如何为 gapi 添加 onload 事件?

4

3 回答 3

3

这是在什么浏览器中看到的?此外,您需要在脚本属性?onload=myFunction的末尾包含一个参数,然后实施以检测库准备情况。加载通常会注入一个额外的脚本节点,您也需要等待那个节点。srcwindow['myFunction'] = function() { ... }

于 2014-10-07T17:47:21.183 回答
0

window.gapi_onload = function() { gapi.auth.authorize(); }

于 2018-06-14T09:41:21.080 回答
0

你也可以试试gapi-script包,这个包立即提供了 gapi,所以你不必等待任何脚本加载,只需导入它并使用:

import { gapi } from 'gapi-script';

并且该包还具有初始化gapi auth2的功能:

import { loadAuth2 } from 'gapi-script';

let auth2 = await loadAuth2(clientId, scopes);
于 2019-07-17T21:00:40.657 回答