1

我实际上一直在尝试调试它一整天,这完全令人困惑。寻找一些提示。

我在 javascript 命名空间中有这些函数:

var ZZ = {
  bar: function(data) {
    console.log(data);
  },
  foo: function() {
    $.ajax({
      'url':'/test',
      'type':'GET',
      'dataType':'jsonp',
      'success':function(ret_json, status) {
        console.log(ret_json);   // SUCCESS_1
        console.log(ret_json[1].title);   //SUCCESS_2
        bar(ret_json);
      }
    });
  },
...
}

所以我查看了开发人员工具的“网络”选项卡,返回的 json 是正确的.. 类似于:

[{'id':1, 'url':'http://a.com', 'title':'hi'}, {'id':2, 'url':'http://b.com', 'title':'hi2'}]

现在我查看控制台并看到在 SUCCESS_1 处,它打印出如下内容:

[{'id':1, 'url':'http://c.com', 'title':'hi3'}, {'id':2, 'url':'http://c.com', 'title':'hi3'}]

如您所见,id 是正确的,但 url 和 title 不正确。(我也可以更改数据库中的ID,它们将被正确执行)

然后在 SUCCESS_2 的下一行,它抓住了正确的标题!'嗨2'

接下来我将调试器语句放入成功函数中:ret_json 看起来完全正确,但是当我进入 bar() 函数时.. 数据再次看起来错误。

接下来我补充:

var hi = {};
console.log(hi);

进入成功功能..它打印出来..(不是开玩笑)

{'url':'http://c.com', 'title':'hi3'}

所以基本上,这个“默认”正在覆盖实际存在的任何内容。

我已经在 ajax 调用中添加了 cache:false,我尝试过 json 和 jsonp,我尝试过清除缓存,我尝试过使用 chrome/safari/firefox .. 但什么也没做,我怀疑这很明显。 ..这真的很糟糕。

关于我可以尝试的任何其他想法?


更新:将此命名空间添加到不同的 html 页面。最令人震惊的例子

var hi = {}
console.log(hi)

打印的东西不见了,但 ret_json 数据错误的原始问题仍然存在。(我仍然无法访问上一个 html 页面的工作版本)

4

2 回答 2

2

@ggez44,这是因为 console.log 不是 Chrome/Firefox/Safari 中的同步调用。通常会有几毫秒的延迟。

它在我的机器上看起来延迟不是恒定的,在 Chrome 中介于 4ms 和 16ms 之间,在 Safari 中约为 2ms。

http://techblog.appnexus.com/2011/webkit-chrome-safari-console-log-bug/

Chrome 开发者工具中奇怪的 console.log 行为

我对此的推测性解决方案是执行“console.log(a.toJSON());”之类的操作。然后你最终得到一个指向传入的字符串对象的指针,它与原始对象无关。

更新:显然这是一个“功能,而不是错误”。在 webkit 邮件列表中有一些相当不错的门票链接。 为什么 javascript 对象在 Chrome、Firefox、Safari 的控制台中显示不同的值?

于 2012-06-25T22:05:18.933 回答
1

您是否在代码中的任何位置添加了以下内容?

Object.prototype.url = "http://c.com";
Object.prototype.title = "hi3";

这是创建空对象时显示这些属性的唯一原因。

于 2012-06-25T19:29:17.273 回答