首页 新闻 会员 周边 捐助

JS循环中执行AJAX返回数据问题

0
悬赏园豆:50 [已解决问题] 解决于 2012-02-27 10:15

    我要实现的功能如下:   

     在一段JS代码中有个for循环,然后for中是调用封装好的AJAX方法。然后我要在for循环中每执行一次AJAX,就将返回的数据显示到页面上。这样保证下面页面显示的内容是动态刷新的。   

     js代码如下:   

     for(var i=0;i<number;i++){        

           var data=sendData(xxxx);        

           //显示数据到指定ul下的li         

           var li=document.createElement("li");        

           li.innerHTML =data;         

            ul.appendChild(li);    }     

      AJAX代码如下:    

             $.ajax({url:"send.do?method=sendData",      

                      data:{"data":value,"ipAddress":ipAddress,"port":port},              

                       type:"POST",      

                       dataType:'dataType',      

                       cache:true,      

                       async:false,      

                       success:function(data){        

                         ret=data;      

              }});     

      我的后台部分就是个socket客户端,执行到后台就是往服务端发送数据,然后返回。现在遇到的问题是js中for循环结束后,并不是一条一条显示而是一起全部显示出来了。如果在for中间写个alert 那么他就是一条条显示了。一开始我以为是时间太快的问题,所以在for中加了setTimeout("",3000);结果是也不好使。请高手帮解决下!

< >
分享
最佳答案
1

ajax是异步的,你要的效果可以用setTimeOut实现,DEMO:

function GetFeed() {
$.ajax({
url: '../WebService/Feed.asmx/GetFeed',
data: "{\"count\":10}",
type: 'post',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
cache: false,
success: function (data) {
//显示在页面
ShowFeed();
},
error: function (xhr) {
}
});
}

function ShowFeed() {
forrun = setInterval("GetFeed()", 5000);
}

效果是每隔5秒种更新页面数据

收获园豆:50
artwl | 专家六级 |园豆:16736 | 2012-02-20 15:29

谢谢啦,问题解决了!

 

憤怒的小鳥 | 园豆:206 (菜鸟二级) | 2012-02-27 10:11

@憤怒的小鳥: 如果解决了请结帖哈

artwl | 园豆:16736 (专家六级) | 2012-02-27 10:12
其他回答(5)
0

dataType:'dataType',  数据类型是什么? 

如果你写 text 

success中 alert(data);能有提示框,否则可能没有执行成功。

$飘渺$ | 园豆:221 (菜鸟二级) | 2012-02-20 14:55

上面的例子是我随便打的,我程序里的AJAX可以返回数据,没有问题。谢谢!主要是解决循环问题。

支持(0) 反对(0) 憤怒的小鳥 | 园豆:206 (菜鸟二级) | 2012-02-20 15:15

@憤怒的小鳥: for循环进程就卡住了,所以要等for结束,才能显示效果。

你说你在for中加了setTimeout。setTimeout加for里干什么呀,

那个setTimeout,没一段时间执行一次,和for的功能不混淆了。

放心,你用setTimeout肯定好使的。

支持(0) 反对(0) $飘渺$ | 园豆:221 (菜鸟二级) | 2012-02-20 15:33
0

问题大家都指出来啦。不知道我这样的代码行不行? 

 1         var number = ...;
2 var i = 0;
3 (function trySendData() {
4 $.ajax({
5 url: "send.do?method=sendData",
6 type: "POST",
7 dataType:...,
8 cache:...,
9 async:true, //
10 success: function(data) {
11 var li=document.createElement("li");
12 li.innerHTML =data;
13 ul.appendChild(li);
14 ret = data;
15 if (++i < number)
16 trySendData(); //setTimeout(trySendData, 500);
17 },
18 error: ....
19 });
20 })();

 

ChatinCode | 园豆:2272 (老鸟四级) | 2012-02-20 16:00
0

我觉得楼主的问题主要是在

ul.appendChild(li);

这里是不是应该加一个setTimeout(fun,0)

小小刀 | 园豆:1991 (小虾三级) | 2012-02-20 22:32
1

js代码的问题。

问题在于,你是在循环中AJAX请求的。 ajax是异步的。

 

解决:应该在ajax完成后,再执行下一个AJAX。

寒风吹过 | 园豆:149 (初学一级) | 2012-02-22 11:51
0

我的在for里执行为什么不行啊

梁林張斌 | 园豆:202 (菜鸟二级) | 2012-05-15 11:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册