Javascript ajax中的循环,对函数执行进行排序
我想使用jquery逐个检查站点服务器,如果服务器正常,就开始抓取页面 但在下面的代码中,循环在第一行执行,第2条消息出现在第一行: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
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);
}
}