"For"循环+"setTimeout"逻辑有困难



我的程序的基本前提是我正在尝试向不同的服务器发送一组"http"请求命令。

我的想法是创建一个"for"循环,并逐个迭代数组,为数组中的每台服务器发送所有批命令,但我遇到了一个冲突,因为"setTimeout","for"环路似乎一直在迭代,只向数组中的最后一台服务器发送"http"请求命令。

如果有人能把它逻辑出来,这样我就可以在正确迭代所有服务器的同时,正确地发送每台服务器的一批httpcmd,我将不胜感激。

这是我的代码示例:

`

function sendHttpCmds(stbnum){
    var stb_num = stbnum;
    var xmlhttp; //cant make this an array of xml https
    function xmlsend(cmd){
        xmlhttp.open("GET",http[cmd],false);
        xmlhttp.send(null);
        }       
    for(var i = 0; i < stb_num; i++){ //this first loop is to iterate through the different servers
       var http = stb_prop.http_list[i];
       var httpLength = http.length;
       var lastIPcmd = stb_prop.ip_list[i];
       if(window.XMLHttpRequest){
          xmlhttp=new XMLHttpRequest();
       }else{
          xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
       }
    for(cmd = 0; cmd < httpLength; cmd++){ //this second loop is to iterate through the httpcmd list that each server has
       (function(cmd){
            setTimeout(function(){
                //main command sent with 2 second intervals
                xmlsend(cmd);                  
            },2000*cmd);//set base delay ~1000-2500 ms
        }(cmd));
    }
}

}`

为了澄清,stb_prop.http_list[i]是一个数组,其中每个元素都包含一个"httpcmds"数组示例:stb_prop.http_list[0]=http_cmds[]

基本上是数组中的一个数组(这是因为我需要根据用户输入动态创建列表)。

我发现http变量有问题

想想会发生什么,第一个for循环开始,更改http,在执行了一些命令后,内部的for循环开始发送所有这些请求。不过,这是异步发生的。所以想象一下,直到外部for循环再次执行,它才真正执行。

这样下去,如果您想象在外部for循环完成之前没有执行任何异步调用,那么http的值将被设置为上一个服务器的值。现在所有的异步调用都执行,但它们都使用http的最后一个值,而不是自己的

一个解决方案可以通过以下方式将http传递给匿名调用的函数:

(function(cmd,http){
            setTimeout(function(){
                //main command sent with 2 second intervals
                xmlsend(cmd,http);                  
            },2000*cmd);//set base delay ~1000-2500 ms
        }(cmd,http));

当然,还可以修改xmlsend以接受http参数。

让我知道它是否有效!

最新更新