2017-05-04 166 views
0

我做了一个发布ajax请求来获取用户details.at次,当我做一个请求时,我得到的响应状态为0(尝试加载资源时发生错误),但大部分我得到了一个有效的响应从服务器的相同的url.I已阅读了几个帖子就我的问题,它所说的是“当你做一个跨域的状态将被返回为0”,但这不是我的情况我正在从同一个域请求。在safari浏览器中随机获取ajax状态为0

每当我得到的地位0.Has人面临这种​​问题的AJAX发送事件不会被炒鱿鱼吗?这是否与Safari浏览器?这似乎提前工作,铬和firefox.Thanks精细

+1

请发表你使用,使Ajax请求的相关代码,你调用服务器代码。我会说这是开始诊断问题的最好方法。 –

回答

0

过去在使用基于webkit的浏览器时遇到此问题。在Web服务器上启用失败的请求跟踪后,我发现该请求甚至没有从浏览器发送。在Web浏览器中启用详细的调试指出了浏览器本身的错误。面对浏览器中的一个突出的错误,我终于到达了以下解决方案。

此代码将在浏览器返回的状态代码为0的情况下重试ajax请求。在所有其他方面,它的功能与jQuery的ajax函数相同。您可以配置代码将重新尝试发送请求的次数。

function AjaxRetry(settings, maxTries, interval) { 
    var self = this; 
    this.settings = settings; 
    this.maxTries = typeof maxTries === "number" ? maxTries : 0; 
    this.completedTries = 0; 
    this.interval = typeof interval === "number" ? interval : 0; 

    return tryAjax().promise(); 

    function tryAjax(deferred) { 
    var d = deferred || $.Deferred(); 
    $.ajax(self.settings) 
     .done(function (data, textStatus, xhr) { 
      self.completedTries += 1; 
      d.resolve(data, status, xhr); 
      self.done = true; 
     }) 
     .fail(function (xhr, textStatus, error) { 

      self.completedTries += 1; 
      var attemptRetry = false; 

      // Added in an attempt to handle the ajax errors that appear to be a flaw in the Intermec HTML5 Browser. 
      // Example error in browser debug log: Curl ERROR: Failed sending data to the peer for url 
      // This appears to be CURLE_SEND_ERROR (55) - Failed sending network data. https://curl.haxx.se/libcurl/c/libcurl-errors.html 

      // This code will retry any ajax requests that fail due to the HTML5 browser CURL error 
      if (typeof (xhr) !== 'undefined' && typeof (textStatus) !== 'undefined' && typeof (error) !== 'undefined') { 
       if (xhr.readyState === 0 && xhr.responseJSON === undefined && xhr.status === 0 && xhr.statusText === 'error') { 
        attemptRetry = true; 
       } 
      } 

      if (self.completedTries < self.maxTries && attemptRetry === true) { 
       //console.log("Waiting " + interval + "ms before retrying..."); 
       setTimeout(function() { 
        tryAjax(d); 
       }, self.interval); 
      } else { 
       d.reject(xhr, textStatus, error); 
      } 

     }); 
    return d; 
} 

}