【问题标题】:Why does Chrome log objects differently at different times? [duplicate]为什么 Chrome 在不同时间记录对象的方式不同? [复制]
【发布时间】:2016-05-09 21:34:24
【问题描述】:

我正在尝试通过 Angular 使用 Google Analytics API。我先加载分析脚本

<script src="https://apis.google.com/js/client.js"></script>

然后我 console.log api 脚本创建的全局 gapi 变量。这将返回对象,如我所料,带有auth 属性。但是gapi.auth 出现undefined

当我让函数等待两秒钟时,它确实按预期运行。这说明了会发生什么:

然而所有的属性都存在于第一个对象中:

为什么后面的有预览,前面的没有?我想这与为什么我只能在 2 秒后访问它们的属性有关。


更新:

我已在脚本顶部添加此检查器以等待 gapi.auth 加载...但它永远不会完成:

while (gapi.auth === undefined) {
    console.log("Still undefined");
}
console.log(loaded now");

【问题讨论】:

  • 我不完全确定我理解你的问题。但是在您实际向 api 发出请求之前,lib 不会请求身份验证信息,并且 api 将需要几秒钟的时间来响应。
  • 我的问题是为什么当 gapi 明显具有 auth 属性时 gapi.auth 最初记录为未定义
  • 是吗? jsfiddle
  • 是的,您可以在第二个屏幕截图中看到它在两种情况下都具有 auth 属性。不过,只有在第二个中它才会自行注销
  • "为什么后面的有预览而前面的没有?" - 有。预览为 {} - 对象在记录时为空。

标签: javascript google-analytics-api console.log google-api-js-client


【解决方案1】:

console.log 函数不会立即评估作为参数给出的对象。仅当您在日志窗口中查看或展开对象时才会对其进行评估。所以如果你的对象改变了它的属性。当您第一次打开日志并尝试展开对象时,您将看到对象的快照。这就是为什么当您过早打开它时,您会看到一个空对象。

【讨论】:

  • 你说的可以参考一下吗?
  • 但这并不能解释为什么当我创建一个 while 循环来检查 gapi.auth === undefined 它永远不会结束。
  • 因为在退出 while 循环时会初始化 gapi.auth。实际上 gapi.auth 是异步加载的。除非您将函数的控制权交给系统,否则无法执行异步函数。你需要知道 java 脚本事件队列是如何工作的。
猜你喜欢
  • 1970-01-01
  • 2012-09-06
  • 2012-11-13
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多