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

标签 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.com 的控制台中运行它,该网站使用 jQuery 1.9.1。我使用 jQuery 1.11.1 也有同样的行为。我总是需要触发来处理 url 不可用的情况。我在 IE11、Chrome 38 和 FF 33 中遇到相同的行为。我做错了什么还是这是一个错误? 谢谢。

最佳答案

这是众所周知的 JSONP 调用。根据$.ajax 错误引用:

Note: This handler is not called for cross-domain script and cross-domain JSONP requests.

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

Cross-domain requests and dataType: "jsonp" requests do not support synchronous operation.

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

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 plugin它添加了错误恢复功能。

关于jQuery.ajax -always() 并不总是运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26980373/

相关文章:

javascript - 将旧值替换为新值(不包括子项)

javascript - 未定义的内嵌函数

c# - 当我在表单 onsubmit 中有函数时,Ajax 不起作用

javascript - 无法确定何时使用 JQuery 隐藏和显示加载动画

javascript - 为什么用 PHP 动态生成的 HTML 不响应 JavaScript?

jquery - 将 JQuery 事件附加到 "on the fly created"控件

javascript - 通过 AJAX 加载子菜单项的 HTML/javascript 上下文菜单

jquery - Bootstrap 3 和 Wordpress 垂直菜单 : keep submenu open when active

javascript - Onsubmit 在 div 上显示成功消息

javascript - 加载的 div Accordion 在窗口而不是容器 div 中打开