簡體   English   中英

如何在 jquery ajax 中處理 net::ERR_CONNECTION_REFUSED

[英]How to handle net::ERR_CONNECTION_REFUSED in jquery ajax

我有這種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);
});

您可以使用$.ajax timeout屬性來觸發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回調。

看起來當 jqXHR.readyState(即 $.ajax(...).fail() 方法的第一個參數的 readyState 字段)為 0 時,表示發生了網絡錯誤。 但是,我無法通過 JavaScript 確定確切的網絡錯誤是什么。

我查看了 jQuery Ajax 代碼,並且 xhr.send()(即 XMLHttpRequest.send())方法(生成網絡錯誤)不會捕獲也不會拋出錯誤。 因此,不可能抓住它。

瀏覽器似乎檢測並顯示了正確的錯誤消息,但 jQuery 沒有注意到發生的特定類型的網絡錯誤。

所以, fail ,如果我們得到一個是被稱為ERR_CONNECTION_REFUSED ,但也沒有辦法真正明白為什么fail被調用。 有沒有辦法檢測失敗方法內部為什么事情失敗? 即超時與連接被拒絕? 兩者之間存在差異。 一個我可以重試,另一個沒有區別。

您不需要設置超時來處理連接拒絕失敗。

    <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>

如果您使用此失敗函數,它將陷入 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>");
        })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM