【问题标题】:How to handle net::ERR_CONNECTION_REFUSED in jquery ajax如何在 jquery ajax 中处理 net::ERR_CONNECTION_REFUSED
【发布时间】:2015-06-07 09:40:19
【问题描述】:

我有这种javascript:

$.ajax({
    url: "//myapi.com/json",
    dataType: "jsonp"
}).done(function (data) {
    selectText('Id', data.country);
}).fail(function (jqXHR, textStatus, errorThrown) {
    var defaultOption = 'US'
    selectDropdownByText('Id', defaultOption);

    console.log(errorThrown);
});

但问题是,在 https 请求时,我的 ajax 无法正常工作,因为我正在调用的服务无法通过 https 访问,并且我收到错误 :ERR_CONNECTION_REFUSED - 这很好,我只想处理它。我在 ajax 调用中有.fail,但它没有处理:ERR_CONNECTION_REFUSED 您能否就在这种情况下如何处理:ERR_CONNECTION_REFUSED 提供建议?

我还试图将我的 ajax 调用包装到 try-catch 块,但它也不起作用。

【问题讨论】:

  • 你尝试过 .error 属性而不是 .fail 吗?
  • 尝试在ajax选项中使用timeout属性触发错误回调
  • @RickHoving 是的,我做到了。 .error 不会因为这种情况而被解雇。

标签: javascript jquery ajax


【解决方案1】:

如果你使用这个失败函数,它会被 jqXHR.status===0 条件捕获。

        .fail(function (jqXHR, exception) {
            // Our error logic here
            var msg = '';
            if (jqXHR.status === 0) {
                msg = 'No connection.\n Verify Network.';
                //ERR_CONNECTION_REFUSED hits this one
            } else if (jqXHR.status == 404) {
                msg = 'Requested page not found. [404]';
            } else if (jqXHR.status == 500) {
                msg = 'Internal Server Error [500].';
            } else if (exception === 'parsererror') {
                msg = 'Requested JSON parse failed.';
            } else if (exception === 'timeout') {
                msg = 'Time out error.';
            } else if (exception === 'abort') {
                msg = 'Ajax request aborted.';
            } else {
                msg = 'Uncaught Error.\n' + jqXHR.responseText;
            }
             $('#info').html("<p class='alert alert-danger msg'>Error: " + msg + "</p>");
        })

【讨论】:

    【解决方案2】:
        <code>$.ajax({
             url: "//myapi.com/json", //this is problem
             dataType: "jsonp"
        }).done(function (data) {
             selectText('Id', data.country);
        }).fail(function (jqXHR, textStatus, errorThrown) {
            var defaultOption = 'US'
            selectDropdownByText('Id', defaultOption);
    
            console.log(errorThrown);
        });</code>
    

    相对路径不好,

     <code>$.ajax({
            url: "myapi.com/json", //this will work
            dataType: "jsonp"
        }).done(function (data) {
            selectText('Id', data.country);
        }).fail(function (jqXHR, textStatus, errorThrown) {
            var defaultOption = 'US'
            selectDropdownByText('Id', defaultOption);
    
            console.log(errorThrown);
        });</code>
    

    【讨论】:

      【解决方案3】:

      当 jqXHR.readyState(即 $.ajax(...).fail() 方法的第一个参数的 readyState 字段)为 0 时,似乎发生了网络错误。但是,我无法通过 JavaScript 确定确切的网络错误。

      我查看了 jQuery Ajax 代码,并且 xhr.send()(即 XMLHttpRequest.send())方法(它会生成网络错误)不会捕获也不会抛出错误。因此,不可能抓住它。

      浏览器似乎检测到并显示了正确的错误消息,但 jQuery 忽略了发生的特定类型的网络错误。

      【讨论】:

        【解决方案4】:

        所以,如果我们得到ERR_CONNECTION_REFUSED,就会调用fail,但是没有办法真正了解为什么调用fail。有没有办法在失败方法内部检测失败的原因?即超时与连接被拒绝?两者是有区别的。一个我可以重试,另一个没有区别。

        您不需要设置超时来处理连接拒绝失败。

        【讨论】:

        • 如果你“失败”超时,函数的“错误”参数将是“超时”而不是“错误”
        【解决方案5】:

        您可以使用$.ajaxtimeout 属性来触发error 回调。

        这将确保在服务器未在特定时间限制内响应时触发 error 回调。

        $.ajax({
            url: "//myapi.com/json",
            dataType: "jsonp",
            timeout: 15000 // adjust the limit. currently its 15 seconds
        }).done(function (data) {
            selectText('Id', data.country);
        }).fail(function (jqXHR, textStatus, errorThrown) {
            var defaultOption = 'US'
            selectDropdownByText('Id', defaultOption);
        
            console.log(errorThrown);
        });
        

        这将在没有互联网时触发fail 回调。

        【讨论】:

        • 那么没有其他办法了吗?你知道为什么try-cath 没有处理那个错误吗? try {$.ajax({ ... });} catch(ex) {}
        • 我可以确认,如果不明确设置超时属性,就无法捕捉到此类问题。另一种方法是检查成功处理程序中的数据值,如果它为空,则执行类似于错误处理程序的操作:stackoverflow.com/a/6792515/615924
        • 在我的情况下,设置超时仍然会导致 net::ERR_CONNECTION_REFUSEDfail 没有运行。还有其他需要满足的条件吗?
        • @sreginogemoh 关于 try{}catch 块,它们对于同步代码很有用。使用异步 ajax 调用,代码运行并注册回调。它们会在几秒钟后触发,而不会阻塞您的其余代码,因此您的 try{}catch 块在 http 承诺对象被履行或拒绝时已经完成运行。
        • @mohamedrias:我很喜欢这个话题,但我也有同样的问题。我尝试使用 timeout ,但是:它在超时之前失败并且仍然有错误日志消息。 .fail() 被触发,所以这是 50% 的胜利。
        猜你喜欢
        • 2019-01-14
        • 1970-01-01
        • 2016-04-15
        • 1970-01-01
        • 2016-12-04
        • 2019-05-21
        • 2016-04-16
        • 1970-01-01
        • 2013-08-05
        相关资源
        最近更新 更多