2017-05-04 32 views
0

在我的項目中,我已經連續調用了近400個同步XHR請求。如何處理Javascript中移動設備上丟失的Wi-Fi開關/連接

function executeRequest(url, data){ 
    var requestObj = new XMLHttpRequest(); 
    requestObj.open("POST", url, true); 
    // prepare the request with some headers 
    // set some eventHandler e.g. onerror, onreadystatechange, onabort 

    requestObj.send(data); 
} 

到目前爲止好。在近97%的案例中,它的效果很好。

有些客戶在android設備上報告錯誤。

POST <網址>網:: ERR_NAME_NOT_RESOLVED

這是我的發現。這是來自Chrome瀏覽器的消息。這指出了DNS問題。

但這令我困惑。該設備可以成功發送和接收例如245請求和246現在有DNS的問題?

它不是任何時候與網:: ERR_NAME_NOT_RESOLVED 有時它請求111其他時間請求358

所以我也很難調查這一問題,因爲結束了相同的請求再現這一點。昨天我發現我可以通過不斷更改WiFi連接來強制這種錯誤。

我有2個不同的網::錯誤

  1. 網:: ERR_NAME_NOT_RESOLVED
  2. 網:: ERR_ADDRESS_UNREACHABLE

我得到的都是根據國家哪一個我的移動設備是。

在執行時間從

requestObj.send(data); 
  1. 如果設備嘗試連接到熱點,比我得到 網:: ERR_NAME_NOT_RESOLVED

  2. 如果設備嘗試連接到互聯網,但連接到熱點,比我得到了net :: ERR_ADDRESS_UNREACHABLE

我的知識不太好,DNS和Chrome如何使用它。

我嘗試用錯誤回調來處理這個問題。

我想再次發送此請求。 現在爲我工作的是,我等了幾次(30秒)並再次發送此請求。

function executeRequest(url, data){ 
    var requestObj = new XMLHttpRequest(); 
    requestObj.open("POST", url, true); 
    // prepare the request with some headers 

    requestObj.onerror = function(e){ 
     setTimeout(function() { 
      executeRequest(url, data); 
     }, 30000); 
    } 
    requestObj.send(data); 
} 

是否有更好的方法來處理這種錯誤? 我不想等30秒。

我還在尋找一些我可以在回調中工作的狀態。

回答

0

使用重試模式:

\t 
 
Definitely not the way to go - while(!done); will go into a hard loop and take up all of your cpu. 
 

 
Instead you could do something like this (untested and you may want to implement a back-off of some sort): 
 

 
function tryUntilSuccess(options, callback) { 
 
    var req = https.request(options, function(res) { 
 
     var acc = ""; 
 
     res.on("data", function(msg) { 
 
      acc += msg.toString("utf-8"); 
 
     }); 
 
     res.on("end", function() { 
 
      var history = JSON.parse(acc); //<== Protect this if you may not get JSON back 
 
      if (history.success) { 
 
       callback(null, history); 
 
      } else { 
 
       tryUntilSuccess(options, callback); 
 
      } 
 
     }); 
 
    }); 
 
    req.end(); 
 

 
    req.on('error', function(e) { 
 
     // Decide what to do here 
 
     // if error is recoverable 
 
     //  tryUntilSuccess(options, callback); 
 
     // else 
 
     //  callback(e); 
 
    }); 
 
} 
 

 
// Use the standard callback pattern of err in first param, success in second 
 
tryUntilSuccess(options, function(err, resp) { 
 
    // Your code here... 
 
});

或者只是清除超時

+0

謝謝您的回答。我有一個重試機制。如果我刪除超時我遇到了同一個net ::錯誤,我們之前得到。直到Wi-Fi連接穩定。我在找的東西就像navigator.onLine。 – SancezZ

+0

更新的Ah thnx。你每天學習新的東西 :) – marcokreeft

相關問題