【问题标题】:jQuery deferred done method not triggered when debugging调试时未触发jQuery延迟完成方法
【发布时间】:2013-10-16 15:53:11
【问题描述】:

我有一个方法是进行 jquery ajax 调用。该方法返回使用$.ajax时由jquery创建的延迟对象:

function callWebservice() {
    return $.ajax({
        type: "POST",
        url: "/echo/json/",
        data: {delay: 2}
    });
}

在调用该方法后,我在代码的不同位置有几个“完成”处理程序(可以访问该方法返回的Deferred):

$(function () {
    var dfr = callWebservice();
    dfr.done(function() { console.log('done 1');})
    dfr.done(function() { console.log('done 2');})
    dfr.done(function() { console.log('done 3');})
    dfr.done(function() { console.log('deferred state 2: ' + dfr.state());})
    console.log('deferred state 1: ' + dfr.state());
});

当我刚刚运行该代码时,一切似乎都很好:我可以在控制台中看到 5 行,最后一行是:“延迟状态 2:已解决”。
然而,当我在第二个done 设置断点并等待 web 服务调用返回时,那么这 4 个done 处理程序都不会被调用。在控制台中是“延迟状态 1:挂起”。

这是预期的行为吗?由于调试,该延迟对象是否无法将其状态更改为“已解决”?还是我没有正确使用它?

我创建了一个fiddle,以便您可以轻松模拟这种行为。

[更新]
它似乎确实在 chrome 中工作。此外,在 IE10 中调试它时,它也可以按预期工作。 当使用 Firefox 的内置调试工具时,它也可以工作。所以这似乎是 Firebug 中的一个错误。

【问题讨论】:

  • 嗯...它似乎对我有用,当我继续越过断点时,它会解析并调用完成的处理程序。
  • 您在继续后是否等待了至少 2 秒?网络服务调用的响应仅在 2 秒多后到达(因此我向 jsfiddle 回显 URL 发送延迟:2)。
  • 是的,等待几秒钟就可以了。
  • 所以我的代码没有问题,是吗? :) 我浪费了几个小时试图找出我做错了什么......这可能是 FF / firebug 的错误 / 功能..
  • 是的,我怀疑是这样,代码看起来不错。

标签: jquery debugging firefox firebug jquery-deferred


【解决方案1】:

它确实是bug in Firebug,或者更准确地说,在它使用的旧 Firefox 调试器 API 中称为 JSD。 这个错误将在 Firebug switched to the new JSD2 APIplanned for the next major release 之后尽快修复。

塞巴斯蒂安

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    相关资源
    最近更新 更多