我想使用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();
}
}
答案 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); } }