我有一个 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”,这也很蹩脚。如果我在这种情况发生时再次打开服务器,它应该停止执行此操作,但如果成功(我在服务器中看到一条日志告诉我它收到了请求),它会继续调用 执行
方法。如果服务器打开,我不知道如何停止此递归。难道我做错了什么?这个状态为零是问题吗?
非常感谢
最佳答案
解决问题
onreadystatechange
会在每次状态更改时触发,从状态 0 到状态 4,以及状态之间的多次。您应该只对 readyState
4 感兴趣,因为此时请求已完全完成。
要使您的方法正常工作,请检查 xmlhttp.readyState == 4
是否:
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status != 200) {
修复 setTimeout 的可怕实现
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.
关于javascript - xmlhttprequest 有奇怪的行为并且状态 = 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9350502/