【问题标题】:Randomly getting ajax status as 0 in safari browser在 Safari 浏览器中随机获取 ajax 状态为 0
【发布时间】:2017-05-04 22:59:04
【问题描述】:

我执行 ajax 后请求来获取用户详细信息。有时,当我执行请求时,我得到的响应状态为 0(尝试加载资源时发生错误),但大多数时候我从服务器得到有效响应对于相同的 url。我已经阅读了一些关于我的问题的帖子,所有帖子都说“当你创建跨域状态时,状态将返回为 0”,但这不是我的情况,因为我正在从同一个域发出请求。

当我的状态为 0 时,不会触发 ajax 发送事件。有人遇到过这种问题吗?它与 safari 浏览器有关吗?它似乎在 chrome 和 firefox 中工作正常。提前致谢

【问题讨论】:

  • 请发布您用于发出 Ajax 请求的相关代码,以及您正在调用的服务器代码。我会说这是开始诊断问题的最佳方式。

标签: jquery ajax safari safari-extension


【解决方案1】:

我过去在使用基于 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;
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 2011-03-05
    • 2014-06-30
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    相关资源
    最近更新 更多