今天写项目的时候,调用了循环去判断,勾选中的按钮可以调用ajax,但是调用ajax返回值的时候,因为一开始设置异步ajax调用,所以等到所有请求请求结束,
这时候循环也进行到最后一层循环,然后才一次性全部返回数据,这个跟业务上的需求不吻合啊,
问题所在:for 循环是一个单线程的东西,而ajax是多线程的,之所以称之为异步同步,是因为执行到ajax的时候去后台开启了一个线程,但是for循环本身就是一个单线程的东西,那么执行到ajax的时候,ajax开启了一个线程,for循环是没有等他的,直到for循环结束的时候,才会把ajax返回的数据拿回来,所以会出问题。
解决办法:只需要把ajax改成同步的就可以了,每次for循环,都要去加载ajax方法,并且拿到他返回的数据,只需要在ajax中间加一个代码就可以搞定了。async: false,//设置成同步。
1、设置ajax参数async为false,即与js同步,默认是true(异步)。
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] 举报,一经查实,本站将立刻删除。