在我的项目中,我连续拨打了近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 :: 错误
我得到的是取决于我的移动设备的状态。
执行时间
requestObj.send(data);
如果设备尝试连接到热点,那么我得到的就是 的净:: ERR_NAME_NOT_RESOLVED
如果设备尝试连接到互联网,但连接到热点,那么 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 :(得分: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;
或者只是删除超时