Javascript ajax中的循环,对函数执行进行排序

Javascript ajax中的循环,对函数执行进行排序,javascript,jquery,ajax,loops,Javascript,Jquery,Ajax,Loops,我想使用jquery逐个检查站点服务器,如果服务器正常,就开始抓取页面 但在下面的代码中,循环在第一行执行,第2条消息出现在第一行: start analyzing site 1 start analyzing site 2 start grabbing site 1 start grabbing site 2 ... 如何将此更改为: start analyzing site 1 start grabbing site 1 ... start analyzing site 2 start

我想使用jquery逐个检查站点服务器,如果服务器正常,就开始抓取页面

但在下面的代码中,循环在第一行执行,第2条消息出现在第一行:

start analyzing site 1
start analyzing site 2

start grabbing site 1
start grabbing site 2
...
如何将此更改为:

start analyzing site 1
start grabbing site 1
...

start analyzing site 2
start grabbing site 1
...
我是Jquery新手,但我读过有关承诺和延迟的内容,但无法编写正确的代码

我通过
async:false
测试了这段代码。它解决了问题,但我不想使用这种方法(你知道原因)

new_links_arr()=数组('site1','site2');
功能检查服务器(响应){
var new_links_c=新链接长度;
对于(var n=0;n5){
$(“#响应”).append(
开始分析站点:“+此链接+”); var myData='mod=chk_srv&url='+encodeURIComponent(此链接)+'&mk_rds_dir=1'; $.ajax({ 键入:“获取”, url:my_url, 数据类型:“json”, 数据:myData, cache:false, 成功:抓取你的网站, 错误:结束错误 }); } } } 功能抓取站点(响应){ $(“#responses”).append(“+response.the_msg+”); var status=response.status; 如果(状态==1){ $(“#响应”).append(“开始抓取站点”); var myData='mod=chk_home&url='+encodeURIComponent(response.url); $(“#Loding_info”).html(“从“+response.url”获取网页和检测软件); $.ajax({ 类型:“POST”, url:my_url, 数据类型:“json”, 数据:myData, 成功:parse_jdata, 错误:结束错误 }) }否则{ $(“#响应”)。追加(“停止”); end_ajax(); } }
您应该在完成前一个测试后开始下一个测试

var new_links_arr = ['site1', 'site2'];
var new_links_index = 0;

function check_server() {

  if (new_links_index >= new_links_arr.length) {
    return;
  }

  var this_link = new_links_arr[new_links_index];

  if (this_link.length > 5) {
    $("#responds").append("<hr/> start analyzing site:  " + this_link + "");

    var myData = {
      mod: 'chk_srv',
      url: this_link,
      mk_rds_dir: 1
    };

    $.ajax({
      type: "GET",
      url: my_url,
      dataType: "json",
      data: myData,
      cache: false,
      success: grab_site,
      error: end_error
    });

  }

}

function grab_site(response) {
  $("#responds").append(" " + response.the_msg + " ");

  var status = response.status;
  if (status == 1) {
    $("#responds").append(" start grabbing site ");
    var myData = {
      mod: 'chk_home',
      url: response.url
    };
    $("#Loding_info").html("Get Homepage and Detecting software from " + response.url);

    $.ajax({
      type: "POST",
      url: my_url,
      dataType: "json",
      data: myData,
      success: parse_jdata,
      error: end_error
    })
  } else {
    $("#responds").append("stop");
    end_ajax();
  }

}

function parse_jdata(response) {
  // do your processing
  // ...
  new_links_index++;
  check_server();
}
var new_links_arr=['site1','site2'];
var新链接索引=0;
功能检查\u服务器(){
如果(新链接索引>=新链接长度){
回来
}
var this_link=new_links_arr[new_links_index];
如果(此链接长度>5){
$(“#响应”).append(
开始分析站点:“+此链接+”); var myData={ mod:'chk_srv', 网址:这个链接, mk_rds_dir:1 }; $.ajax({ 键入:“获取”, url:my_url, 数据类型:“json”, 数据:myData, cache:false, 成功:抓取你的网站, 错误:结束错误 }); } } 功能抓取站点(响应){ $(“#responses”).append(“+response.the_msg+”); var status=response.status; 如果(状态==1){ $(“#响应”).append(“开始抓取站点”); var myData={ 国防部:“chk_home”, url:response.url }; $(“#Loding_info”).html(“从“+response.url”获取主页和检测软件); $.ajax({ 类型:“POST”, url:my_url, 数据类型:“json”, 数据:myData, 成功:parse_jdata, 错误:结束错误 }) }否则{ $(“#响应”)。追加(“停止”); end_ajax(); } } 函数解析_jdata(响应){ //做你的处理 // ... 新链接索引++; 检查_服务器(); }
我的代码很长(超过10个函数)。所以我切下了一部分,制作了一个新的数组(真正的数组是由php根据之前的响应和json发布的)。这就是代码中出现错误的原因

Barmar的想法(在最终函数中增加数组索引)很有帮助。我改变了我的代码,它现在工作得很好。谢谢你的帮助

我在下一个功能中添加了一个接一个发送站点的新功能:

function walk_in_links_arr(new_links_arr2) { if (new_links_index >= new_links_arr2.length) { //alert(' new_links_index11 = ' + new_links_index); $("#responds").append("all sites checking done. "); pass_response_final(); } var this_link = new_links_arr2[new_links_index]; //alert(' new_links_index22 = ' + new_links_index); //alert (this_link); if(this_link.length>5) { $("#responds").append(" start checking " + this_link + " "); var myData = 'mod=chk_srv&url='+ encodeURIComponent(this_link)+'&mk_rds_dir=1'; $.ajax({ type: "GET", url: my_url, dataType:"json", data:myData, cache: false, success:grab_site, error:end_error }); } else { new_links_index++; walk_in_links_arr(new_links_arr); } } 功能漫游链接(新链接链接2) { 如果(新链接\u索引>=新链接\u arr2.length) { //警报(“新链接索引11=”+新链接索引); $(“#响应”)。追加(“所有站点检查完成。”; 通过_响应_最终(); } var this_link=new_links_arr2[new_links_index]; //警报(“新链接索引22=”+新链接索引); //警报(此链接); 如果(此链接长度>5) { $(“#响应”)。追加(开始检查“+此链接+””; var myData='mod=chk_srv&url='+encodeURIComponent(此链接)+'&mk_rds_dir=1'; $.ajax({ 键入:“获取”, url:my_url, 数据类型:“json”, 数据:myData, cache:false, 成功:抓取你的网站, 错误:结束错误 }); } 其他的 { 新链接索引++; 步入链接(新链接); } }
不要对循环使用
,而是在第一个循环的
success
函数中启动第二个测试,依此类推。我使用了success。但这并不能解决问题。(也许我在编码上有错误。)什么是
new_links_arr()=array('site1','site2')做什么?您无法分配给函数调用,而且JS中没有
array()
函数。看起来应该是
var new\u links\u arr=['site1','site2']检查服务器的
响应
参数是什么?你从不使用它。
function walk_in_links_arr(new_links_arr2) 
    {
        if (new_links_index >= new_links_arr2.length) 
        {
            //alert(' new_links_index11 = ' + new_links_index);
            $("#responds").append("all sites checking done.  ");
            pass_response_final();
        }

        var this_link = new_links_arr2[new_links_index];
        //alert(' new_links_index22 = ' + new_links_index);
        //alert (this_link);
        if(this_link.length>5)
        {
                $("#responds").append(" start checking  " + this_link + " ");


                var myData = 'mod=chk_srv&url='+ encodeURIComponent(this_link)+'&mk_rds_dir=1';

                $.ajax({
                type: "GET", 
                url: my_url,
                dataType:"json",
                data:myData, 
                cache: false,
                success:grab_site,
                error:end_error
                });
        }
        else
        {
            new_links_index++;
            walk_in_links_arr(new_links_arr);           
        }
   }