我有一个Google Chrome扩展程序,按下按钮后会向服务器执行xmlhttp请求。如果服务器关闭,我正在处理错误。我想要实现的是在越来越多的秒后重试请求。这就是我的方式:
var execute = function(method, url, i){
//if timeout doesn't exist, create one
if(!i){
i = 1000;
}
var xmlhttp = new XMLHttpRequest();
xmlhttp.open(method, url, true);
xmlhttp.onreadystatechange = function(){
if (xmlhttp.status != 200) {
// Handle error, retry request
console.log("xmlhttp.status = " + xmlhttp.status + " and xmlhttp.readyState = " + xmlhttp.readyState);
setTimeout("execute('"+method+"', '"+url+"', "+i*2+")", i);
return;
}
};
xmlhttp.send(null);
}
基本上如果出现某种问题,我会再次重试请求。如果服务器已启动,则完全没有问题,但如果服务器关闭,则JavaScript会向我发出错误消息:
PUT http://localhost:3000/buy/2/id=1329664820124
executepopup.html:127
(anonymous function)
然而,这并不是真正有意义的。日志中的状态显示为“0”,这也很蹩脚。如果我继续打开服务器,它应该停止这样做,但是如果它成功了(我看到服务器中的一个日志告诉我它收到了请求),它会一直调用{{1 }} 方法。如果服务器开启,我不知道如何停止这种递归。难道我做错了什么?这个状态是否等于问题?
非常感谢
答案 0 :(得分:4)
onreadystatechange
,从状态0到4,以及之间多次。您应该只对readyState
4感兴趣,因为此时请求已完全完成。
要使您的方法有效,请检查xmlhttp.readyState == 4
:
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status != 200) {
<小时/>
setTimeout("execute('"+method+"', '"+url+"', "+i*2+")", i);
不是再次调用函数的正确方法。由于您使用Chrome扩展程序进行开发,因此可以使用以下格式setTimeout
:
setTimeout(execute, i, method, url, i*2);
// Calls execute(method, url, i*2) after i milliseconds.