我使用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中都有相同的行为。我做错了什么或者这是一个错误? 感谢。
答案 0 :(得分:7)
这是JSONP调用所知的。根据{{1}}的{{3}}引用:
注意:不会为跨域脚本和跨域JSONP请求调用此处理程序。
另请注意,不支持同步JSONP调用:
跨域请求和dataType:" jsonp"请求不支持同步操作。
变通方法通常涉及1)为呼叫设置超时或2)使用插件添加更多典型的error
功能。
1)设置超时(和async true)
error
2)$.ajax添加了错误恢复功能。