【发布时间】:2013-06-25 14:03:58
【问题描述】:
当单击按钮时,我正在尝试在提交表单之前对其进行连接检查。想法是查看尚未在此代码中实现的超时请求“Timeout()...”,并继续遍历 Ajax 直到找到连接,因为有时在现场连接可能会断开。当找到连接时,它会提醒用户,如果在点击提交后连接断开,它将成功提交。这是我目前所拥有的:
function upload_prepformDiff() {
$.ajax({
type: 'POST',
url: './php/upload_prepform.php',
timeout: 2000, //2 seconds, for testing purposes
data: prepform,
async: false,//Omitted now as of this post
dataType: 'text',
success: function() {
alert("Your Prep form has been submitted.");
window.top.location.replace('./');
},
error: function (xhr, status, error) {
if(status == "timeout") {
alert("Internet connection has been lost! Please wait until you are notified and do not continue.");
} else {
alert(status + " " + error);
}
}
});
};
问题是,即使超时值较低,我也没有收到“超时”状态消息,而是收到“错误”。所以它永远不会抛出我需要的超时错误,并且我得到错误:错误:NETWORK_ERR:XMLHttpRequest Exception 101
所以 ajax 确实注意到没有连接,但这就是 errorThrown 显示的内容,而 textStatus 分别是 (xhr, status, error) 的“错误”。所以我尝试做的是做一些即兴创作并做某种类型的 error.indexOf() 处理 Ajax 中抛出的错误字符串,但这不起作用,error.contains("NETWORK_ERR") 或任何类型的正则表达式命令。有什么改进的想法或为什么我没有超时?谢谢!
【问题讨论】:
-
为什么使用
async: false?另外,你确定错误回调是ajax请求超时触发的,还是服务器端有错误? -
啊,我一定是在发帖前的最后一秒改变了一些东西,忘了改回来。至于 async false,我这样做是因为我使用的是全局变量,例如 //Global variables var prepform = { 'cable_no' : "", 'prep_date' : "", 'co_name' : "" } 然后遍历那些全局变量HTML 中的变量 for (eID in prepform) { prepform[eID] = document.getElementById(eID).value; //alert(prepform[eID]+': '+document.getElementById(eID).value);和 async: false 是 ajax 正确触发以传递所有数据的唯一方法。
-
@jflay:这不是使用
async: false的理由。完全可以执行启用异步的循环。 -
@BradM 我也获得了成功并通过连接上传到我的 SQL 数据库,所以那里没有错误,但只有当我没有任何连接时,我才会收到错误,我期望一个“超时”,但我得到“错误”。我确实为 Ajax 请求调用了 PHP,所以我可能因为 Ajax 无法访问 Ajax URL 请求中的那个 PHP 文件,所以它会抛出错误?我不知道如何改变它......我只是想要某种方式告诉用户他们没有连接。我收到了正确的错误消息,但不知道状态是什么...
标签: javascript ajax timeout