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

我正在使用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中得到了相同的行为。我做错了什么或者这是一个错误? 谢谢。

这是JSONP调用已知的东西。 根据error的$ .ajax参考:

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

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

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

解决方法通常涉及1)为调用设置超时或2)使用插件添加更多典型的errorfunction。

1)设置超时(和async true)

 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插件 ,它增加了错误恢复function。