gpt4 book ai didi

jQuery $.ajax,错误处理程序不起作用

转载 作者:行者123 更新时间:2023-12-03 22:27:33 25 4
gpt4 key购买 nike

您好,我注意到这个简单的代码没有按预期的方式工作...

    function test() {
$.ajax( {
'url' : 'test/GameConfiguration.json',
'dataType' : 'json',
data : {
a : 'aaa'
},
cache : false,
method : 'get',
timeout : 10000, //10 secs of timeout
success : function(data, textStatus, XMLHttpRequest) {
console.log("success");
if (data == null)
console.log("it's not a real success");
},
error : function(XMLHttpRequest, textStatus, errorThrown) {
console.log("error: " + textStatus);
}
});
}

测试已在本地主机上运行,​​我的意思是:我加载页面,关闭本地网络服务器,然后触发请求(通过一个带有 onclick 的简单按钮指向此函数)。错误永远不会被调用,我得到的是调用成功处理程序,并且它具有 textStatus =“success”和 data = null。我什至注意到请求在 10 秒之前就超时了。这种情况发生在 Firefox(最新版本)、Chrome(最新版本)和 Safari 5 上。为什么会这样?是因为我在本地主机上工作吗?

<小时/>

我忘了告诉您:请求没有被缓存。事实上,firebug 和 Chrome 开发工具都显示请求失败。

<小时/>

重大更新

此行为与 localhost 的使用有关。事实上,如果我从另一台同事电脑加载此页面,并且在触发请求之前我断开电脑与网络的连接,我会正确地触发错误处理程序,并将超时作为状态。我认为这是 jQuery 的一个错误。这将使我很难测试超时错误:(

<小时/>

来自 jQuery 论坛的人说这是由于网络堆栈中止连接的方式造成的,因为主机是 localhost。我仅在 Windows 7 上进行了测试。如果您想在其他系统上进行测试并且可以了解一些 jQuery 内部原理,请向 jQuery 论坛上的这篇文章报告:

http://forum.jquery.com/topic/strange-and-unexpected-behaviour-of-ajax-error-and-localhost#14737000001331961

最佳答案

更新:尝试将测试 (data == null) 替换为 (XMLHttpRequest.readyState === 4 && XMLHttpRequest.status === 0).

在关于 XMLHttpRequest 标准的 W3C 候选建议中,描述了它必须存在所谓的“错误标志”,该标志应用于指示某种类型的网络错误或中止。如果出现此类错误,XMLHttpRequest 中的状态将为 0,而不是 200(“正常”)、201(“已创建”)、304(“未修改”)等。正好对应http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute如果 XMLHttpRequest.readyState 等于 0 或 1(“UNSENT”或“OPENED”),则 XMLHttpRequest.status 可以为 0。另一种情况是 XMLHttpRequest.readyState 等于 4(“DONE”)并且“错误标志”为 true。如果这两种情况都没有,则 XMLHttpRequest.status 必须是 HTTP 状态代码。下http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.htmlhttp://www.w3.org/Protocols/HTTP/1.0/spec.html#Status-Codes没有 HTTP 状态代码等于 0。所以在我看来你可以执行以下操作

jQuery(document).ready(function () {
$.ajax({
type: 'GET',
url: 'test/GameConfiguration.json',
dataType: 'json',
cache : false,
success: function(data, textStatus, xhr){
if (xhr.readyState === 4 && xhr.status === 0) {
// if readyState is DONE (numeric value 4) then corresponds to
// http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-done
// "The DONE state has an associated error flag that indicates
// some type of network error or abortion."
// Corresponds to http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute
// If error flag it true, xhr.status is 0.
alert('"error flag\" is true. It means that we have a network error"+
" or abortion (for example because of Same Origin Policy restrictions)');
}
else {
alert(textStatus);
alert(data);
}
},
error: function(xhr, textStatus, errorThrown) {
if (textStatus !== null) {
alert("error: " + textStatus);
} else if (errorThrown !== null) {
alert("exception: " + errorThrown.message);
}
else {
alert ("error");
}
}
});
});

关于jQuery $.ajax,错误处理程序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3616823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com