javascript - xmlhttprequest 有奇怪的行为并且状态 = 0

标签 javascript xmlhttprequest

我有一个 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/

相关文章:

javascript - 如何完整接收外部网页的XMLHttpRequest

javascript - 我是否在生产构建期间或准备生产时删除 webpack-dev-server 和热模块中间件代码?

javascript - For 循环问题 JavaScript

javascript - 哪个性能更好: XmlHttpRequest response as HTML or JSON?

javascript - 是否可以将 Digest-Authentication 与 XMLHTTPRequest 一起使用?

node.js - 使用 XMLHttpRequest 2 设置 Cookie

javascript - 有没有办法为 Typescript 中的嵌套键访问创建类型保护?

javascript - 如何使用 $.ajax 在使用 jquery 加载的内容中包含 javascript

javascript - 如何防止元素退出或跳出页面?

java - 向 Web 服务 Opengts 发送 XML 请求以从 Android 应用程序登录时出错