我使用jquery ajax方法向web服务器发送大量数据,客户端只有在收到服务器的确认后才响应,现在假设网络连接在ajax调用的MIDDLE中丢失,那么如何检测这种情况。
$.ajax({
url:'server.php',
data:'lots of data from 200KB to 5MB',
type:'post',
success: function(data)
{
alert('Success');
//some stuff on success
},
error: function(XMLHttpRequest, textStatus, errorThrown)
{
alert('Failure');
//some stuff on failure
}
});
这是我的代码,如果让互联网断开连接,它在ajax调用中间不会出错。
注意:我不能使用超时,因为数据大小从200kb到5MB不等,服务器响应时间计算不可行。
答案 0 :(得分:6)
试试这个:
首先创建一个" ping"每隔5秒使用setInterval调用ajax
function server_ping()
{
$.ajax({
url:"url to ping",
type: "POST"
});
}
var validateSession = setInterval(server_ping, 5000);
然后武装你的.ajaxError陷阱:
$(document).ajaxError(function( event, request, settings ) {
//When XHR Status code is 0 there is no connection with the server
if (request.status == 0){
alert("Communication with the server is lost!");
}
});
记住Ajax调用默认是异步的,所以当ping进入服务器并且请求无法到达服务器时,XHR状态的值为0,并且.ajaxError将触发,你必须捕获错误并处理你想要的方式。
然后您可以将数据发送到服务器,如果在发送数据时连接丢失,则会收到ping报告的错误。
答案 1 :(得分:3)
如果您的服务器不是很拥挤,那么当您开始传输数据时,可能会使用计时器开始定期检测连接(通过使用另一个ajax调用,例如每5秒)。现在你可以使用超时。
顺便说一下, 1)超时并不总是意味着网络错误。有时服务器的关闭也会导致“超时”
2)如果驱动程序在客户端设备上关闭,xhr.status = 0,并且没有超时
答案 2 :(得分:2)
我遇到了类似你的情况并通过每5秒进行一次网络检查来修复它,如果网络断开,我会手动中止ajax请求,这将结束ajax请求。
这里我在Jquery ajax调用的beforeSend事件中获取了ajax XmlHttpRequest,并在网络出现故障时使用该对象中止ajax请求。
var interval = null;
var xhr = null;
$.ajax({
beforeSend: function(jqXHR, settings) {
xhr = jqXHR; // To get the ajax XmlHttpRequest
},
url:'server.php',
data:'lots of data from 200KB to 5MB',
type:'post',
success: function(data)
{
alert('Success');
//some stuff on success
},
error: function(XMLHttpRequest, textStatus, errorThrown)
{
alert('Failure');
//some stuff on failure
},
complete: function(data)
{
alert('Complete');
//To clear the interval on Complete
clearInterval(interval);
},
});
interval = setInterval(function() {
var isOnLine = navigator.onLine;
if (isOnLine) {
// online
} else {
xhr.abort();
}
}, 5000);
答案 3 :(得分:2)
我有一个类似的问题并用simpel try / catch和重试延迟(比方说)2秒来解决它:
function myAjaxMethod()
{
try
{
$.ajax({ ... });
} catch (err)
{
console.log(err.message);
setTimeout(function(){myAjaxMethod(),2000});
}
}
答案 4 :(得分:0)
尝试添加超时:构建$ .ajax({})。
还要确保设置cache:false,有时会有所帮助。
请参阅Jquery的ajax():http://api.jquery.com/jQuery.ajax/#toptions
您将获得更多信息!
我的想法[更新]
@ RiteshChandora,我理解你的担忧。我怎么能建议你做两件事。
由于发布的数据范围为200kb到5mb,您可能希望选择最大超时。并触发相同的。是的,这可能会有问题,但是根据您选择的设计,监控POST进度的唯一方法就是这样做。如果没有,请参见第2点。
我完成了流程,您要求用户将响应Json从FB复制到您的网址。这里有一些问题,
json数据包含有关用户的敏感信息,他将其发布在没有SSL加密的网址上。
为什么要提示用户将获取的数据发布到您的服务器上?如果您使用服务器端脚本应该会更容易。此外,您不应该在这样的情况下将大量数据从客户端发布到服务器,您可以在服务器端检索FBserver->您的服务器端的相同表单。
我建议的解决方案:在用户通过身份验证后,在服务器端检索他的好友列表。在服务器端执行任何操作,并在用户屏幕上显示结果。
这样一来,您的服务器将承担所有负担,用户也无需在您的网址上发布任何令人讨厌的json帖子。
顺便说一下,你的app想法很酷。
答案 5 :(得分:-5)
error: function(xhr, textStatus, thrownError)
{
alert(xhr.status);
alert(thrownError);
alert(textStatus);
}
试试.. TextStatus(除了null)是“超时”,“错误”,“中止”和“parsererror”。 发生HTTP错误时,thrownError会收到HTTP状态的文本部分,例如“Not Found”或“Internal Server Error”。
如果互联网断开连接,则不会收到响应,并且最大值将是超时消息..