我的程序的基本前提是我正在尝试向不同的服务器发送一组"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参数。
让我知道它是否有效!