我正在使用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'); });
Run Code Online (Sandbox Code Playgroud)
您可以在使用jQuery 1.9.1的jquery.com的控制台中运行它.我使用jQuery 1.11.1有相同的行为.当网址不可用时,我总是需要触发以处理时间.我在IE11,Chrome 38和FF 33中都有相同的行为.我做错了什么或者这是一个错误?谢谢.
这是JSONP调用已知的东西.根据$ .ajax参考error:
注意:不会为跨域脚本和跨域JSONP请求调用此处理程序.
另请注意,不支持同步JSONP调用:
跨域请求和dataType:"jsonp"请求不支持同步操作.
解决方法通常涉及1)为呼叫设置超时或2)使用插件添加更多典型error功能.
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'); });
Run Code Online (Sandbox Code Playgroud)
2)jQuery JSONP插件,它增加了错误恢复功能.
| 归档时间: |
|
| 查看次数: |
16737 次 |
| 最近记录: |