就是业务上需要完成一个功能,这个功能需要依次调用四个接口,后面接口的参数都依赖于前一个接口的返回值。

类似这样:

 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的问题的更多相关文章

  1. 关于js中循环遍历中顺序执行ajax的问题(vue)

    js里的循环,每次都是自顾自的走,它不等ajax执行好走完到success代码,就继续循环下一条数据了,这样数据就全乱了. 后来,想到试试ajax里async这个属性,async默认是true,即为异 ...

  2. Java循环遍历中直接修改遍历对象

    Java 循环遍历中直接修改遍历对象如下,会报异常: for (ShopBaseInfo sp: sourceList) { if(sp.getId()==5){ sourceList.remove( ...

  3. JAVA中循环遍历list有三种方式

    转自:https://blog.csdn.net/changjizhi1212/article/details/81036509JAVA中循环遍历list有三种方式for循环.增强for循环(也就是常 ...

  4. js 各种循环遍历

    js 各种循环遍历(表格比较) 遍历方法 能否遍历数组 能否遍历对象 备注 for 能 不能 for in 能(有诸多缺点) 能 为遍历对象而设计的,不适用于遍历数组 forEach 能 不能 bre ...

  5. js并行加载,顺序执行

    js并行加载,顺序执行 <script>运行脚本或加载外部文件时,会阻塞页面渲染,阻塞其他资源的加载.如果页面中需要加载多个js文件,在古老浏览器中性能会比较糟糕. 因此有了最原始的优化原 ...

  6. jquery each循环遍历完再执行的方法 因为each是异步的 所以要加计数器.

    query each循环遍历完再执行的方法因为each是异步的 所以要加计数器.var eachcount=0;$(“.emptytip”).each(function(){ eachcount++c ...

  7. 二叉树系列 - 二叉搜索树 - [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 ...

  8. jquery each循环遍历完再执行的方法

    jquery each循环遍历完再执行的方法 因为each是异步的 所以要加计数器. var eachcount=0; <pre> $(".emptytip").eac ...

  9. Python的list循环遍历中,删除数据的正确方法

    在遍历list,删除符合条件的数据时,总是报异常,代码如下: num_list = [1, 2, 3, 4, 5] print(num_list) for i in range(len(num_lis ...

随机推荐

  1. kettle简介(整体架构,运行方式,使用方法)

    项目负责人Matt的说法:把各种数据放到一个壶里,然后呢,以一种你希望的格式流出.呵呵,外国人都很有联想力.看了提供的文档,然后对发布程序的简单试用后,可以很清楚得看到Kettle的四大块: Chef ...

  2. gcc学习(二)[第二版]

    头文件与库文件 1.概要 在使用C语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统及库函数调用的声明. 库文件是一些预先编译好的函数集合,那些函数都是按照可重用原则编写的.它 ...

  3. Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide图片缓存库的联系与区别

    Universal-Image-Loader,android-Volley,Picasso.Fresco和Glide五大Android开源组件加载网络图片比较 在Android中的加载网络图片是一件十 ...

  4. cocos2D v3.x中动作回调函数的变化

    cocos2D v3.x版本中的动作的回调函数不能再带任何参数并且不能返回任何值. 官方给出的传递参数的办法是: 选择器(selector)不能带有任何形参,选择器需要的参数必须通过ivar或prop ...

  5. android 高斯模糊实现

    高斯模糊 高斯模糊就是将指定像素变换为其与周边像素加权平均后的值,权重就是高斯分布函数计算出来的值. 一种实现 点击打开链接<-这里是一片关于高斯模糊算法的介绍,我们需要首先根据高斯分布函数计算 ...

  6. warning: implicit declaration of function 'getMyfilename' [-Wimplicit-function-declaration]|

    我在main后面定义了getMyfilename()函数,然后就报出这个warning. 在main前声明一下就好了.

  7. React Native Android开发环境配置

    近些年,Web前端甚是火爆,火爆程度堪比我毕业时的移动端开发一般.随着JavaScript的火爆,移动端也不安分了起来,ReactNative就异军突起了,几乎要做到"一次学习,四处开发&q ...

  8. Mongodb3.6 快速入门(一)

    一.安装 官网下载地址 文章中用的3.6community server 64 位. 安装完成后的目录如下: 二.启动Mongodb 有多种方式可以启动Mongodb,但在实际项目中,主要还是通过配置 ...

  9. java设计原则---开闭原则

    开闭原则:指的是一个软件实体应对对扩展开发,对修改关闭(Software entities should be open for extension, but closed for modificat ...

  10. MySQL 8 新特性之Invisible Indexes

    背景 索引是把双刃剑,在提升查询速度的同时会减慢DML的操作.毕竟,索引的维护需要一定的成本.所以,对于索引,要加上该加的,删除无用的.前者是加法,后者是减法.但在实际工作中,大家似乎更热衷于前者,而 ...