20

我正在使用 jquery ajax 方法向 Web 服务器发送大量数据,客户端仅在收到服务器的确认后才响应,现在假设网络连接在 ajax 调用的中间丢失,那么如何检测这种情况。

$.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 不等,服务器响应时间计算不可行。

4

6 回答 6

6

尝试这个:

首先每 5 秒使用 setInterval 创建一个“ping”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 报告的错误。

于 2014-08-05T15:52:12.713 回答
3

如果您的服务器不是很拥挤,那么您可能可以在开始传输数据时使用计时器开始定期检测连接(通过使用另一个 ajax 调用,例如每 5 秒一次)。现在您可以使用超时。

顺便说一句,1)超时并不总是意味着网络错误。有时服务器停机也会导致“超时”

2)如果驱动程序在客户端设备上关闭,xhr.status = 0,并且没有超时

于 2014-01-12T02:39:19.107 回答
2

我遇到了类似的问题,并通过简单的 try/catch 和(比如说)2 秒的重试延迟解决了它:

function myAjaxMethod()
{
  try 
  {
    $.ajax({ ... });
  } catch (err) 
  { 
    console.log(err.message); 
    setTimeout(function(){myAjaxMethod(),2000});
  }
}
于 2016-06-16T10:14:46.323 回答
1

我遇到了与您类似的情况,并通过每 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);
于 2014-07-01T09:26:40.463 回答
0

尝试添加超时:在构建 $.ajax({}) 时。

还要确保设置缓存:假,有时很有帮助。

参考 Jquery 的 ajax() :http ://api.jquery.com/jQuery.ajax/#toptions

您将在那里获得更多信息!

我对你的问题的看法[更新]

@RiteshChandora,我理解你的担忧。我怎么能建议你做两件事。

  1. 由于您发布的数据范围从 200kb 到 5mb,因此您可能需要选择最大超时时间。并触发相同的。是的,这可能有问题,但是对于您选择的设计,监控 POST 进度的唯一方法就是这样做。如果没有,请参阅第 2 点。

  2. 我完成了流程,您要求用户将响应 Json 从 FB 复制到您的 url。这里有一些问题,

  3. json 数据包含有关用户的敏感信息,他将其发布在没有 SSL 加密的 url 上。

  4. 为什么要提示用户将获取的数据发布到您的服务器上?如果您使用服务器端脚本,它应该会更容易。此外,在这种情况下,您永远不应该将大量数据从客户端发布到服务器,在这种情况下,您可以从服务器端的 FBserver->your sevrer 检索相同的表单。

我建议的解决方案:用户通过身份验证后,在服务器端检索他的朋友列表。在服务器端做任何你想做的事,并在用户屏幕上显示结果。

这样,您的服务器将承担所有负担,用户也无需在您的 url 上发布任何讨厌的 json。

顺便说一句,你的应用创意很酷。

于 2012-06-15T04:59:36.707 回答
-5
   error: function(xhr, textStatus, thrownError)
                    {
                       alert(xhr.status);
                       alert(thrownError);
                       alert(textStatus);

                    }

试试看 。TextStatus(除了 null)是“timeout”、“error”、“abort”和“parsererror”。当 HTTP 错误发生时,throwError 接收 HTTP 状态的文本部分,例如“未找到”或“内部服务器错误”。

如果 Internet 断开连接,则不会收到响应,并且最多将是超时消息。

于 2012-06-15T05:12:43.820 回答