jQuery.ajax - always()并不总是在运行

时间:2014-11-17 19:25:39

标签: jquery ajax

我使用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有相同的行为。当网址不可用时,我总是需要触发以处理时间。我在IE11,Chrome 38和FF 33中都有相同的行为。我做错了什么或者这是一个错误? 感谢。

1 个答案:

答案 0 :(得分:7)

这是JSONP调用所知的。根据{{​​1}}的{​​{3}}引用:

  

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

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

  

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

变通方法通常涉及1)为呼叫设置超时或2)使用插件添加更多典型的error功能。

1)设置超时(和async true)

error

2)$.ajax添加了错误恢复功能。