【问题标题】:jQuery.ajax - always() not always runningjQuery.ajax - always() 并不总是运行
【发布时间】:2014-11-18 04:19:51
【问题描述】:

我正在使用 jQuery.ajax 进行 REST 调用并检索一些 JSON。它按预期工作。但是,当我强制执行错误条件(例如 URL 无效)时,always 方法不会触发。如果我设置 crossDomain=false 或 dataType='json',那么总是会触发。但是,我不能在我的生产代码中这样做。如果您设置 url='http://ip.jsontest.com/' 则始终触发。我创建了一个小例子来说明这个问题:

var jqXHR = jQuery.ajax({
    type: 'GET',
    async: false,
    cache: false,
    url: 'http://ip.jsontest.com.BADURL/',
    contentType: 'application/json; charset=UTF-8',
    crossDomain: true,
    dataType: 'jsonp'
})
.done(function (data, textStatus, jqXHR) {
    console.log('Your IP is ' + data.ip);
    console.log('done was called');
})
.fail(function (jqXHR, textStatus, errorThrown) {
    console.log('fail was called');
})
.always(function (dataOrjqXHR, textStatus, jqXHRorErrorThrown) { console.log('always was called'); });

您可以在使用 jQuery 1.9.1 的 jquery.com 的控制台中运行它。我使用 jQuery 1.11.1 有同样的行为。当 url 不可用时,我总是需要触发以处理时间。我在 IE11、Chrome 38 和 FF 33 中得到了相同的行为。我做错了什么还是这是一个错误? 谢谢。

【问题讨论】:

    标签: jquery ajax


    【解决方案1】:

    这是众所周知的 JSONP 调用。根据$.ajax 参考error:

    注意:跨域脚本和跨域 JSONP 请求不会调用此处理程序。

    另请注意,不支持同步 JSONP 调用:

    跨域请求和dataType:“jsonp”请求不支持同步操作。

    解决方法通常包括 1) 设置调用超时或 2) 使用插件添加更典型的 error 功能。

    1) 设置超时(并且异步为真)

    var jqXHR = jQuery.ajax({
        type: 'GET',
        async: true,
        cache: false,
        url: 'http://ip.jsontest.com.BADURL/',
        contentType: 'application/json; charset=UTF-8',
        crossDomain: true,
        dataType: 'jsonp',
        timeout: 2000
    })
    .fail(function (jqXHR, textStatus, errorThrown) {
        console.log('fail was called');
    })
    .done(function (data, textStatus, jqXHR) {
        console.log('Your IP is ' + data.ip);
        console.log('done was called');
    })
    .always(function (dataOrjqXHR, textStatus, jqXHRorErrorThrown) { console.log('always was called'); });
    

    2) jQuery JSONP plugin 增加了错误恢复功能。

    【讨论】:

    • 听起来 always() 的名字很糟糕。 :-)
    • .always_except_for_CORS()
    猜你喜欢
    • 2014-01-30
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多