【问题标题】:Consecutive calls to console.log produce inconsistent results对 console.log 的连续调用会产生不一致的结果
【发布时间】:2014-03-30 08:50:44
【问题描述】:

好吧,我完全被这个吓傻了。 (我可能忽略了一些明显的东西,但是......)

我连续两次调用 console.log。他们之间没有别的事了

console.log($state);
console.log($state.current);

这是生成结果的图像

为什么两者会产生不同的“当前”对象?怎么会这样?


上下文:

这些调用是在 ajax 调用中进行的,同时解决路由依赖关系。如果您需要更多代码或上下文,请告诉我。

在 Chrome 和 Firefox 中确认了同样的问题

Ajax 调用和包装函数(没有任何修改)

normaCtrl.publicNorma = ['$http', '$state', '$stateParams', 'baseUrl', function ($http, $state, $stateParams, baseUrl)
{
    var id = $stateParams.id;
    return $http.get(baseUrl + "api/public/norma/" + id).then(
        function (response) {
            console.log($state);
            console.log($state.current);
            console.log($state.current.title);
            return response.data;
        }
    );
}];

可能的相关问题

【问题讨论】:

  • 请提供您的 ajax 请求代码)
  • 是否有可能触发多个 ajax 请求?你能显示 $state 的实际设置位置吗?
  • 其他对象会影响这个变量吗?
  • $state 由 AngularJs 的第三方库 ui-router 设置
  • @FUserThrowError 是的,其他对象可能会影响此变量。 AngularJS 在后台做了很多事情

标签: javascript angularjs console.log angular-ui-router


【解决方案1】:

很奇怪。它是具有奇怪吸气剂的 ECMA 5 对象吗?对于普通的 $state 调用仍然没有意义。我认为您的 GC 不只是有问题...

你确定这些是被记录的电话吗?

【讨论】:

  • Javascript 不是多线程的。该变量不能在 console.log 调用之间更改值
  • 糟糕,没有注意到它在承诺的同一部分......我应该去睡觉了
  • 我愿意。对 console.log 进行了项目范围的搜索,这些是仅有的 3 个匹配项
【解决方案2】:

好吧,这就是那些偶然发现这个问题的人的答案。

简答

Console.log 在执行的最后状态显示深层可变对象,而不是在调用 console.log 时的状态

更多详情

基本上,在使用可变深层对象时,Console.log 存储对所述对象的引用,而不是存储对象克隆。

由于存储和可视化之间存在时间间隔,当您单击箭头进行进一步检查时,您看到的实际上是对象的当前状态,而不是状态调用 console.log 时的对象

始终确保您使用“对象快照”的一种方法是调用Json.stringify 或在可用时使用console.dir

【讨论】:

  • 请注意,Chrome 上的 console.dir 可能无法正常工作(我记得可以,但现在不行了)。 Json.stringify 工作。
猜你喜欢
  • 1970-01-01
  • 2014-12-30
  • 2017-08-18
  • 2012-12-17
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
相关资源
最近更新 更多