微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当ajax遇见循环

今天写项目的时候,调用了循环去判断,勾选中的按钮可以调用ajax,但是调用ajax返回值的时候,因为一开始设置异步ajax调用,所以等到所有请求请求结束,

这时候循环也进行到最后一层循环,然后才一次性全部返回数据,这个跟业务上的需求不吻合啊,

问题所在:for 循环是一个单线程的东西,而ajax是多线程的,之所以称之为异步同步,是因为执行到ajax的时候去后台开启了一个线程,但是for循环本身就是一个单线程的东西,那么执行到ajax的时候,ajax开启了一个线程,for循环是没有等他的,直到for循环结束的时候,才会把ajax返回的数据拿回来,所以会出问题。

  解决办法:只需要把ajax改成同步的就可以了,每次for循环,都要去加载ajax方法,并且拿到他返回的数据,只需要在ajax中间加一个代码就可以搞定了。async: false,//设置成同步。

1、设置ajax参数async为false,即与js同步,认是true(异步)。

也可以采用方法2解决好像,我还没有试过呢,递归循环的解决

2、采用递归循环的方法解决此问题。

function func(times){
    if(times <= 0){
        return;
    }
    $.get(url,data,function(){
        times --;
        func(times); //递归调用
    });
}
func(5);

 接下来我在试试:

1、当async:false的时候,

2、当async:true的时候,

3、采用递归的方式:

可以看出只有当设置了异步形式,ajax一下子就到了8阶段,其余的7个阶段暂时没有了,其实是等到了最后一起返回值了所有值,

而一般我们是每一个循环的过程,都要获取相应的值的才对。一个小坑,踩过了,下次就好办多了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐