如何在Javascript

时间:2017-05-04 13:34:00

标签: javascript android google-chrome dns xmlhttprequest

在我的项目中,我连续拨打了近400个XHR请求。

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< url>净:: ERR_NAME_NOT_RESOLVED

我发现了什么。这是来自Chrome浏览器的消息。这指出了DNS问题。

但这令我困惑。该设备可以成功发送和接收例如245请求和246现在有DNS问题吗?

不是任何时候以 net :: ERR_NAME_NOT_RESOLVED 结尾的相同请求 有时它的请求111在请求358的其他时间。

所以我很难调查这个问题,因为要重现这个问题。昨天我发现我可以通过不断更改WiFi连接来强制这种错误。

我有2个不同的 net :: 错误

  1. 净:: ERR_NAME_NOT_RESOLVED
  2. 净:: ERR_ADDRESS_UNREACHABLE
  3. 我得到的是取决于我的移动设备的状态。

    执行时间

    requestObj.send(data); 
    
    1. 如果设备尝试连接到热点,那么我得到的就是 的净:: ERR_NAME_NOT_RESOLVED

    2. 如果设备尝试连接到互联网,但连接到热点,那么 net :: ERR_ADDRESS_UNREACHABLE

    3. 我的知识不太好,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秒。

      我也在寻找一些我可以在回调中工作的状态。

1 个答案:

答案 0 :(得分:0)

使用重试模式:



	
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...
});
&#13;
&#13;
&#13;

或者只是删除超时