关于js中循环遍历中顺序执行多个嵌套ajax的问题
就是业务上需要完成一个功能,这个功能需要依次调用四个接口,后面接口的参数都依赖于前一个接口的返回值。
类似这样:
var objArr = "从其他逻辑获得";
for(var n in objArr){
$.ajax({
type : 'post',
url : '../xxx/xxxx',
data : {param:objArr[n].xxx},
async : false,
secureuri : false,
contentType : "application/json;charset=utf-8",
dataType : 'JSON',
success : function(data) { $.ajax({
type : 'post',
url : '../xxx/xxxx',
data : {param:data.xxx},
async : false,
secureuri : false,
contentType : "application/json;charset=utf-8",
dataType : 'JSON',
success : function(data1) { $.ajax({
type : 'post',
url : '../xxx/xxxx',
data : {param:data1.xxx},
async : false,
secureuri : false,
contentType : "application/json;charset=utf-8",
dataType : 'JSON',
success : function(data2) { $.ajax({
type : 'post',
url : '../xxx/xxxx',
data : {param:data2.xxx},
async : false,
secureuri : false,
contentType : "application/json;charset=utf-8",
dataType : 'JSON',
success : function(data3) { if(n = data3.length){
alert("全部完成");
} }
}); }
}); }
}); }
});
}
但是事实不与愿为,因为什么呢?这个js里的循环,每次都是自顾自的走,它不等ajax执行好走完到success代码,就继续循环下一条数据了,这样数据就全乱了。
后来,想到试试ajax里async这个属性,async默认是true,即为异步方式,那我改为false同步行不行呢?答案是也是不行,阻塞在那了。
然后把每一个ajax都写一个方法,调相应的方法,测试也是无效。
最后搞半天换了个思路,不是从技术上解决的,这个问题的关键是循环数据的时候,ajax的数据是依赖等待返回的,只要涉及到遍历循环,那这个问题就肯定存在。
那能不能避开循环呢?想到一个方法,这四个ajax分别写四个方法,这四个方法都有固定的两个参数,一个是我们要使用的数据objArr,一个是一个计数器num,这样
var objArr = "从其他逻辑获得";
for(var n in objArr){
xxxA(objArr,0);
} function xxxA(objArr, num){
$.ajax({
type : 'post',
url : '../xxx/xxxx',
data : {param:objArr[num].xxx},
async : false,
secureuri : false,
contentType : "application/json;charset=utf-8",
dataType : 'JSON',
success : function(data) { xxxB(objArr, num, data); }
});
} function xxxB(objArr, num, back){
$.ajax({
type : 'post',
url : '../xxx/xxxx',
data : {param:back.xxx},
async : false,
secureuri : false,
contentType : "application/json;charset=utf-8",
dataType : 'JSON',
success : function(data1) { xxxC(objArr, num, data1); }
});
} function xxxC(objArr, num, back){
$.ajax({
type : 'post',
url : '../xxx/xxxx',
data : {param:back.xxx},
async : false,
secureuri : false,
contentType : "application/json;charset=utf-8",
dataType : 'JSON',
success : function(data2) { xxxC(objArr, num, data2); }
});
} function xxxD(objArr, num, back){
$.ajax({
type : 'post',
url : '../xxx/xxxx',
data : {param:back.xxx},
async : false,
secureuri : false,
contentType : "application/json;charset=utf-8",
dataType : 'JSON',
success : function(data3) { if(num = arrObj.length-1){
69 alert("全部完成");
70 }else{
71 xxxA(objArr,num+1);
72 } }
});
}
它的大致思路是 分为四个方法,每个方法都有两个参数,一个要遍历的数据,一个计数器,BCD三个方法还有个参数,就是上一个方法返回的数据, 先调A,A里面再调B,B里面再调C,C里面再调D,D里面判断一下,如果num = arrObj.length-1就代表全部走完,没有就继续再调A,依次循环。
关于js中循环遍历中顺序执行多个嵌套ajax的问题的更多相关文章
- 关于js中循环遍历中顺序执行ajax的问题(vue)
js里的循环,每次都是自顾自的走,它不等ajax执行好走完到success代码,就继续循环下一条数据了,这样数据就全乱了. 后来,想到试试ajax里async这个属性,async默认是true,即为异 ...
- Java循环遍历中直接修改遍历对象
Java 循环遍历中直接修改遍历对象如下,会报异常: for (ShopBaseInfo sp: sourceList) { if(sp.getId()==5){ sourceList.remove( ...
- JAVA中循环遍历list有三种方式
转自:https://blog.csdn.net/changjizhi1212/article/details/81036509JAVA中循环遍历list有三种方式for循环.增强for循环(也就是常 ...
- js 各种循环遍历
js 各种循环遍历(表格比较) 遍历方法 能否遍历数组 能否遍历对象 备注 for 能 不能 for in 能(有诸多缺点) 能 为遍历对象而设计的,不适用于遍历数组 forEach 能 不能 bre ...
- js并行加载,顺序执行
js并行加载,顺序执行 <script>运行脚本或加载外部文件时,会阻塞页面渲染,阻塞其他资源的加载.如果页面中需要加载多个js文件,在古老浏览器中性能会比较糟糕. 因此有了最原始的优化原 ...
- jquery each循环遍历完再执行的方法 因为each是异步的 所以要加计数器.
query each循环遍历完再执行的方法因为each是异步的 所以要加计数器.var eachcount=0;$(“.emptytip”).each(function(){ eachcount++c ...
- 二叉树系列 - 二叉搜索树 - [LeetCode] 中序遍历中利用 pre节点避免额外空间。题:Recover Binary Search Tree,Validate Binary Search Tree
二叉搜索树是常用的概念,它的定义如下: The left subtree of a node contains only nodes with keys less than the node's ke ...
- jquery each循环遍历完再执行的方法
jquery each循环遍历完再执行的方法 因为each是异步的 所以要加计数器. var eachcount=0; <pre> $(".emptytip").eac ...
- Python的list循环遍历中,删除数据的正确方法
在遍历list,删除符合条件的数据时,总是报异常,代码如下: num_list = [1, 2, 3, 4, 5] print(num_list) for i in range(len(num_lis ...
随机推荐
- JSONP获取Twitter和Facebook文章数
原文链接: Retrieve Twitter and Facebook Counts with JSON 翻译人员: 铁锚 原文日期: 2014年02月19日 翻译日期: 2014年02月22日 !! ...
- 写论文如何做相关工作(realted work)的调研
1.找一篇目标研究领域的中文综述,读懂,对该领域有了些基本的了解,如何找到好的综述,就是要关注一些大牛的实验组的综述和进展: 2.找该中文综述引用的外文文献来看,通常是一些比较经典的文献 3.找这些外 ...
- Leetcode_278_First Bad Version
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/49719255 You are a product mana ...
- gradle构建android项目详解
1.用Gradle构建 1.1 工程结构 如图所示,这是一个不能更普通的Android的Gradle工程了. 根目录下面的settings.gradle当中主要是用来include子模块的,比如我们这 ...
- MaterialDesign学习项目
概述 该项目主要用来学习Material Design Support Library和一些android其他技术,也借鉴了网上一些其他优秀的学习资源.该项目目前主要分为俩大部分(后期可能会有一些增加 ...
- LeetCode(28)-Remove Duplicates from Sorted Array
题目: Given a sorted array, remove the duplicates in place such that each element appear only once and ...
- Course4-Python ftp/ssh
1. ftp Python 自带有模块支持ftp. 可以参看一下代码. #!/usr/bin/env python import sys import os import time import ge ...
- jQuery之select的option怎样绑定事件
HTML: <select id='select'> <option value='0'>上海</option> <option value='1'>北 ...
- Java深入了解TreeSet
Java中的TreeSet是Set的一个子类,TreeSet集合是用来对象元素进行排序的,同样他也可以保证元素的唯一.那TreeSet为什么能保证元素唯一,它是怎样排序的呢?先看一段代码: publi ...
- [总结] 二维ST表及其优化
二维 \(\mathcal{ST}\) 表,可以解决二维 \(\mathcal{RMQ}\) 问题.这里不能带修改,如果要修改,就需要二维线段树解决了. 上一道例题吧 ZOJ2859 类比一维 \(\ ...