2017-09-01 33 views
0

我試圖在用戶使用beforeSend事件和回調(我不想使用同步ajax)支付ajax函數之前檢查互聯網連接。我相信我在這裏丟失了一些東西,作爲ping不斷回調未定義值的函數。如何異步處理另一個ajax的beforeSend事件中的ajax回調?

我的回調函數

function checkNetConnection(u, s, e) { 
    var c=0 
    $.ajax({ 
     success: s(), 
     error: e, 
     url: u, 
     type: 'Get', 
    }); 
} 

所以我創建了一個片段顯示兩個ajax電話,其中之一是隻是一個測試,並執行回調的第二個。我在這裏做錯了什麼,所以回撥在beforeSend事件中不會返回true?

function testcall() { 
 
    $.ajax({ 
 
    beforeSend: function(jqXHR) {}, 
 
    url: "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js", 
 
    type: "Get", 
 
    success: function(res) { 
 
     console.log('jquery.min.js call ok!') 
 
    }, 
 
    error: function(jqXHR, textStatus, errorThrown) { 
 
     console.log("jquery.min.js call Failed"); 
 
    } 
 
    }); 
 
}; 
 

 
function checkNetConnection(u, s, e) { 
 
    $.ajax({ 
 
    success: s, 
 
    error: e, 
 
    url: u, 
 
    type: 'Get', 
 
    }); 
 
} 
 

 
function callthis() { 
 
    $.ajax({ 
 
    beforeSend: function(jqXHR) { 
 
     if (checkNetConnection("https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js", 
 
      function() { 
 
      return true; 
 
      }, 
 
      function() { 
 
      return false; 
 
      } 
 
     )) { 
 
     console.log("jquery.min.js call ok"); 
 
     } else { 
 
     console.log("jquery.min.js call Failed"); 
 
     jqXHR.abort(); 
 
     }; 
 

 
    }, 
 
    url: "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js", 
 
    type: "Get", 
 

 
    success: function(res) { 
 
     console.log('jquery.min.js call ok!') 
 
    }, 
 
    error: function(jqXHR, textStatus, errorThrown) { 
 
     console.log("jquery.min.js call Failed"); 
 
    } 
 
    }); 
 
}; 
 
$("#bt1").click(function() { 
 
    testcall(); 
 
}); 
 

 
$("#bt2").click(function() { 
 
    callthis(); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<input id="bt1" type="button" value="Test call (Connection Not tested)" /> <br/> <br/> 
 

 
<input id="bt2" type="button" value="Function call (Connection tested) " />

回答

1

beforeSend是同步功能,Ajax不是。您正嘗試暫停基於異步函數的函數的執行。你不能這樣做,因爲checkNetConnection的執行不會阻止beforeSend,直到它得到結果,它將開始執行Ajax調用,該調用檢查網絡連接,然後在網絡連接ajax觸發之前繼續執行jQuery庫的Ajax回調。

此外,爲什麼你會檢查網絡連接?用戶確實到達了您的頁面?如果他失去了連接,反正你會得到一個錯誤,所以你可以通過ajax error回調來處理錯誤。