JavaScript:setTimeout不';不要暂停循环

JavaScript:setTimeout不';不要暂停循环,javascript,delay,settimeout,Javascript,Delay,Settimeout,我需要在我的循环中进行一些延迟,每次在向服务器发送一定数量的数据(经过我的循环的几个周期/迭代之后)之后 从服务器发送数据和接收响应工作正常,但循环中请求的延迟仍然不起作用 非常感谢你的帮助 编辑:代码已更改,请检查第三个答案(我的) AJAX 请求数据 函数loadDoc(){ var xhttp=[]; 变量代码=[ “WOICEL0Q9P”, “ZJTS4GYJEJ”, “HJPMQOCX31”, “MP26N0BH01”, “7TJNYZIRJR”, “Z5MIDDG4N2”, “B

我需要在我的循环中进行一些延迟,每次在向服务器发送一定数量的数据(经过我的循环的几个周期/迭代之后)之后

从服务器发送数据和接收响应工作正常,但循环中请求的延迟仍然不起作用

非常感谢你的帮助

编辑:代码已更改,请检查第三个答案(我的)


AJAX
请求数据

函数loadDoc(){ var xhttp=[]; 变量代码=[ “WOICEL0Q9P”, “ZJTS4GYJEJ”, “HJPMQOCX31”, “MP26N0BH01”, “7TJNYZIRJR”, “Z5MIDDG4N2”, “BX6MKYK0O7”, “KVFVH1ESQX”, “40ADY3ZBE5”, “V4NT360JR5”, “FDI8AFL680”, “ZH89N59XQR”, “M6OS2OX38H”, “D8O76YDLM0”, “86GBMJLIXY”, “1QRFVU26VK”, “HFUI9QV6DY”, “VN83OGR825”, “DDMPCBX2MF”, “2M3QFPI234” ]; var i=代码长度; var j=代码长度; var k=5000; var p=0; 而(我--){ var进程=(函数(i){ 如果(p==5){ p=0; 函数func(i){ xhttp[i]=新的XMLHttpRequest(); xhttp[i].onreadystatechange=函数(){ if(xhttp[i].readyState==4&&xhttp[i].status==200){ 如果(i==j){ document.getElementById(“demo”).innerHTML=code[i]+“:”+xhttp[i].responseText; } 否则{ document.getElementById(“demo”).innerHTML++=“

”+code[i]+”:“+xhttp[i]。responseText; } } }; xhttp[i].打开(“POST”https://www.example.com/services/postdata.svc“,对); xhttp[i].setRequestHeader(“主机”,“www.example.com”); xhttp[i].setRequestHeader(“Accept”、“application/json、text/javascript”); xhttp[i].setRequestHeader(“接受语言”,“cs,en-US;q=0.7,en;q=0.3”); xhttp[i].setRequestHeader(“接受编码”,“gzip,deflate,br”); xhttp[i].setRequestHeader(“内容类型”,“应用程序/json;字符集=utf-8”); xhttp[i].setRequestHeader(“缓存控制”,“无缓存”); xhttp[i].setRequestHeader(“X-Requested-With”,“XMLHttpRequest”); xhttp[i].setRequestHeader(“Referer”https://www.example.com/postdata-test.htm"); xhttp[i].setRequestHeader(“内容长度”,“37”); xhttp[i].setRequestHeader(“连接”,“保持活动”); xhttp[i].send('{“code”:“'+code[i]+',“confirm”:false}”); //log('hello-testif delay is here'); p++; } 设置超时(func(i),k); k+=5000; } 否则{ xhttp[i]=新的XMLHttpRequest(); xhttp[i].onreadystatechange=函数(){ if(xhttp[i].readyState==4&&xhttp[i].status==200){ 如果(i==j){ document.getElementById(“demo”).innerHTML=code[i]+“:”+xhttp[i].responseText; } 否则{ document.getElementById(“demo”).innerHTML++=“

”+code[i]+”:“+xhttp[i]。responseText; } } }; xhttp[i].打开(“POST”https://www.example.com/services/postdata.svc“,对); xhttp[i].setRequestHeader(“主机”,“www.example.com”); xhttp[i].setRequestHeader(“Accept”、“application/json、text/javascript”); xhttp[i].setRequestHeader(“接受语言”,“cs,en-US;q=0.7,en;q=0.3”); xhttp[i].setRequestHeader(“接受编码”,“gzip,deflate,br”); xhttp[i].setRequestHeader(“内容类型”,“应用程序/json;字符集=utf-8”); xhttp[i].setRequestHeader(“缓存控制”,“无缓存”); xhttp[i].setRequestHeader(“X-Requested-With”,“XMLHttpRequest”); xhttp[i].setRequestHeader(“Referer”https://www.example.com/postdata-test.htm"); xhttp[i].setRequestHeader(“内容长度”,“37”); xhttp[i].setRequestHeader(“连接”,“保持活动”); xhttp[i].send('{“code”:“'+code[i]+',“confirm”:false}”); p++; } })(i) ); } }
您不断地在
中生成对
process()
的多个调用,然后告诉
process
在回调发生之前等待5秒

// Run this loop over and over again
while (true) {
    // Create a function called process that process data
    var process = (function () {
        // Do something with data
        console.log("Something");
        // Wait a few seconds and do it again
        setTimeout(process, 5000);
    // This () right here says call process right now
    }());
}

运行代码时,while循环不会等待setTimeout,因为它是异步的

但您可以执行以下操作以使代码正常工作

var p = 0;
var k = 0;
var now = new Date();
var code = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
for (var index = 0; index < code.length; index++) {
    (function(idx, timeout){
        setTimeout(function(i) {
            //write your code herei
            console.log("printed after", (new Date() - now)/1000, " Seconds");

        }, timeout, idx);
        p++;
        if(p==5){
            p = 0;
            k += 5000;
        }
    })(index, k);
}

谢谢你的帮助,但是我可以要求你更正我的代码吗?我在JavaScript编程方面仍然没有太多经验。我在您发布的代码中修复了括号,我只是保持了递减while循环,但脚本现在无法工作。我在控制台中遇到了这个错误:Uncaught TypeError:无法读取未定义的属性'readyState'。谢谢你,我会立即检查你的代码。EDIT:嗯,它只是缺少k的定义,但你的脚本仍然不能按照我的需要工作。循环5个周期后,必须有延迟,而这不在代码中。顺便说一句,谢谢你的努力。不工作的人,未捕获的引用错误:k没有定义你到底想做什么?连续打5个电话,然后等待5秒,然后再连续打5个电话,依此类推?或者只有每五次呼叫延迟5秒编辑2:每次我在预设的延迟post请求发送到服务器后单击按钮,我都可以看到响应。但我需要该脚本自动生成并发送循环中的请求,例如循环5次之后
var p = 0;
var k = 0;
var now = new Date();
var code = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
for (var index = 0; index < code.length; index++) {
    (function(idx, timeout){
        setTimeout(function(i) {
            //write your code herei
            console.log("printed after", (new Date() - now)/1000, " Seconds");

        }, timeout, idx);
        p++;
        if(p==5){
            p = 0;
            k += 5000;
        }
    })(index, k);
}
printed after 0.006  Seconds
printed after 0.008  Seconds
printed after 0.008  Seconds
printed after 0.008  Seconds
printed after 0.008  Seconds
printed after 5.008  Seconds
printed after 5.008  Seconds
printed after 5.008  Seconds
printed after 5.008  Seconds
printed after 5.008  Seconds
printed after 10.007  Seconds
printed after 10.007  Seconds
printed after 10.007  Seconds
printed after 10.007  Seconds
printed after 10.007  Seconds
printed after 15.008  Seconds
printed after 15.008  Seconds
printed after 15.008  Seconds
printed after 15.008  Seconds
printed after 15.008  Seconds