Javascript GAE/Angular应用程序中window.init()上的无限循环

Javascript GAE/Angular应用程序中window.init()上的无限循环,javascript,angularjs,google-app-engine,Javascript,Angularjs,Google App Engine,我将cloud enpoints演示与AngularJS一起使用,在加载client.js后,我将使用他们建议的运行授权的方法运行无限循环。以下是建议的方法 首先,在所有其他脚本标记之后(对于Angular和其他JS文件,我正在这样做): 我想我发现的是,这里存在一个竞争条件,$window.init设置得不够早,因此我最后得到一条消息: 未捕获范围错误:超过最大调用堆栈大小 这是因为“window.init()”只是调用init()函数并超出堆栈 关于如何更好地处理这个问题,有什么建议吗?谢谢

我将cloud enpoints演示与AngularJS一起使用,在加载client.js后,我将使用他们建议的运行授权的方法运行无限循环。以下是建议的方法

首先,在所有其他脚本标记之后(对于Angular和其他JS文件,我正在这样做):

我想我发现的是,这里存在一个竞争条件,$window.init设置得不够早,因此我最后得到一条消息:

未捕获范围错误:超过最大调用堆栈大小

这是因为“window.init()”只是调用init()函数并超出堆栈


关于如何更好地处理这个问题,有什么建议吗?谢谢。

看起来您的角度控制器没有及时加载/执行,不知道为什么,但您可以等待文档准备就绪,以真正的jQuery方式:

function init() {
    angular.element(document).ready(function() {
        window.init();
    });
}

Angular当时应该已经完成加载。

看起来您的Angular控制器没有及时加载/执行,不知道为什么,但您可以等待文档准备就绪,以真正的jQuery方式:

function init() {
    angular.element(document).ready(function() {
        window.init();
    });
}

Angular应该已经完成加载。

第一行在那里创建了一个无限循环,因为您正在实际的window.init中调用window.init

<script>
    /**
     * Initializes the Google API JavaScript client. Bootstrap the angular module after loading the Google libraries
     * so that Google JavaScript library ready in the angular modules.
     */
    function init() {
        gapi.client.load('conference', 'v1', null, '//' + window.location.host + '/_ah/api');
        gapi.client.load('oauth2', 'v2', callback);
    };
</script>
<script src="//apis.google.com/js/client:plusone.js?onload=init"></script>

/**
*初始化Google API JavaScript客户端。加载Google库后引导angular模块
*让谷歌JavaScript库在angular模块中就绪。
*/
函数init(){
gapi.client.load('conference','v1',null',/'+window.location.host+'/_ah/api');
load('oauth2','v2',回调);
};

您可以试试这段代码,看看它是否对您更有意义,因为您正在实际的window.init中调用window.init,所以第一行在那里创建了一个无限循环

<script>
    /**
     * Initializes the Google API JavaScript client. Bootstrap the angular module after loading the Google libraries
     * so that Google JavaScript library ready in the angular modules.
     */
    function init() {
        gapi.client.load('conference', 'v1', null, '//' + window.location.host + '/_ah/api');
        gapi.client.load('oauth2', 'v2', callback);
    };
</script>
<script src="//apis.google.com/js/client:plusone.js?onload=init"></script>

/**
*初始化Google API JavaScript客户端。加载Google库后引导angular模块
*让谷歌JavaScript库在angular模块中就绪。
*/
函数init(){
gapi.client.load('conference','v1',null',/'+window.location.host+'/_ah/api');
load('oauth2','v2',回调);
};
你可以试试这段代码,看看它是否对你更有意义,把它放在“我错过了一些非常基本的东西”栏中:

我注意到我在控制器定义中忘记了一些东西:

topNavBar.$inject = ['$location', 'appContext', 'logger'];
function topNavBar($location, $window, appContext, logger) {
注意,注入中没有“$window”,因此它得到了appContext的定义,执行“$window.init=”绝对没有效果。

将其放入“我错过了一些非常基本的东西”栏:

我注意到我在控制器定义中忘记了一些东西:

topNavBar.$inject = ['$location', 'appContext', 'logger'];
function topNavBar($location, $window, appContext, logger) {

请注意,注入中没有“$window”,因此它得到了appContext的定义,并且执行“$window.init=”绝对没有效果。

这样做,就是告诉window.init调用自己,创建了一个无限循环

<script>
    function init() {
        window.init();
    }
    init===window.init; // => true
</script>
<script src="https://apis.google.com/js/client.js?onload=init"></script>

接受答案的注释中的代码等待api加载以引导应用程序,这需要更长的时间。

这样做,就是告诉window.init调用自身,创建一个无限循环

<script>
    function init() {
        window.init();
    }
    init===window.init; // => true
</script>
<script src="https://apis.google.com/js/client.js?onload=init"></script>

接受答案的注释中的代码等待api加载以引导应用程序,这需要更长的时间。

实际上没有帮助。刚刚进入另一个无限循环,因为我认为window.init()仍然导致“ready”再次捕获。您确定您的angular代码正在正确加载和执行吗?在控制器中更改函数名,看看会发生什么,它要么工作,要么抛出未定义。如果我只是将我的函数重命名为“init1”,什么都不会发生,它就是不会被调用。但是,如果我也将onload赋值重命名为“init1”,那么在“window.init();”调用中就没有定义。在我看来,“$window.init=function()”赋值并没有真正赋值。最后,我注意到我做错了什么。请看下面我的答案。这不是一个解决方案,真的!实际上没有帮助。刚刚进入另一个无限循环,因为我认为window.init()仍然导致“ready”再次捕获。您确定您的angular代码正在正确加载和执行吗?在控制器中更改函数名,看看会发生什么,它要么工作,要么抛出未定义。如果我只是将我的函数重命名为“init1”,什么都不会发生,它就是不会被调用。但是,如果我也将onload赋值重命名为“init1”,那么在“window.init();”调用中就没有定义。在我看来,“$window.init=function()”赋值并没有真正赋值。最后,我注意到我做错了什么。请看下面我的答案。这不是一个解决方案,真的!是的,我可以看到这是如何工作的,但是想法是进入Angular控制器逻辑来处理身份验证,这将把它拉出来。我知道这是可行的,但我想把会话信息存储在一个角度工厂中。看看这段代码:它可能会给你一个更好的方法来处理它。老兄,你真厉害!就是这样。是的,我知道这将如何工作,但想法是进入Angular控制器逻辑来处理身份验证,这将把它拉出来。我知道这是可行的,但我想把会话信息存储在一个角度工厂中。看看这段代码:它可能会给你一个更好的方法来处理它。老兄,你真厉害!就这样,还有一张小纸条。我第一次看到的这种方法,如果是在全局范围内(否),效果会更好!看来这里还有比赛条件。也许10次尝试中有1次,我收到了堆栈超出的消息。另一个小提示。我第一次看到的这种方法,如果是在全局范围内(否),效果会更好!看来这里还有比赛条件。可能10次尝试中有1次,我收到堆栈超出消息。