Google Analytics:analytics.js初始化期间的竞争条件?

时间:2014-08-20 16:33:36

标签: javascript asynchronous google-analytics universal-analytics

我正在使用Google Analytics(analytics.js)来监控网站。如果任何脚本无法执行,我希望能够报告异常。

因此,例如,如果某个应用程序有一个.js文件,如果该文件包含拼写错误,我希望能够报告该GA的例外情况。所以,我不能把“创建”调用放在我的JS中,我必须先把它放进去。

通过在HEAD中执行,我找到了一种可以90%的时间工作的方式:

(function (i, s, o, g, r, a, m) {
    i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () {
        (i[r].q = i[r].q || []).push(arguments)
    }, i[r].l = 1 * new Date(); a = s.createElement(o),
    m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m);

    // MY CODE
    i[r]('create', 'UA-XXXXXX-Y', 'auto');
    i.addEventListener('error', function (e) {
        i[r]('send', 'exception', {
            'exDescription': "'" + e.message + "': '" + e.filename + "' at line " + e.lineno,
            'exFatal': true
        });
    });
    // END MY CODE

})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');

当我的应用程序加载报告两个内容时,“页面浏览”和“定时”之后(总是发生在“页面浏览”之后),但大约40%的时间,只有第一个报告给GA服务器。尽管无论如何都要调用“window.ga”,并且控制台上没有错误,我看到HTTP请求缺少“计时”。但是只有30-40%的时间才会发生。

它看起来像竞争条件,所以我尝试通过将代码分成三个块来同步加载脚本。第一个块进入队列,第二个块同步获取文件,第三个块初始化跟踪器:

<script>
((function (i, s, o, g, r, a, m) {
    i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () {
        (i[r].q = i[r].q || []).push(arguments)
    }, i[r].l = 1 * new Date()
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
</script>
<script src="//www.google-analytics.com/analytics.js"></script>
<script>
 window.ga('create', 'UA-XXXXXX-Y', 'auto');
 window.addEventListener('error', function (e) {
        window.ga('send', 'exception', {
            'exDescription': "'" + e.message + "': '" + e.filename + "' at line " + e.lineno,
            'exFatal': true
        });
    });
</script>

它每次都有效。但是,如果我再次将脚本设置为async

<script src="//www.google-analytics.com/analytics.js" async></script>

然后在40%的时间里它再次错过了计时事件。

为什么会这样?

哪种方法可以实现我最初的报告脚本解析异常的想法?

0 个答案:

没有答案