在ajax中循环,订购函数执行

时间:2015-11-14 00:18:49

标签: javascript jquery ajax loops

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

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

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的新手,但我读过关于 promise 和deferrals的内容,但无法编写正确的代码。

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

new_links_arr() = array('site1', 'site2');

function check_server(response) {

  var new_links_c = new_links_arr.length;

  for (var n = 0; n < new_links_c; n++) {
    var this_link = new_links_arr[n];

    if (this_link.length > 5) {
      $("#responds").append("<hr/> start analyzing site:  " + 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
      });

    }
  }

}

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=' + encodeURIComponent(response.url);
    $("#Loding_info").html("Get Homapage 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();
  }

}

2 个答案:

答案 0 :(得分:0)

完成前一个测试后,您应该开始下一个测试。

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();
}

答案 1 :(得分:0)

我的代码很长(超过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);           
        }
   }