当前位置: 首页 > 编程笔记 >

关于多个Ajax请求执行返回先后的问题示例探讨

季森
2023-03-14
本文向大家介绍关于多个Ajax请求执行返回先后的问题示例探讨,包括了关于多个Ajax请求执行返回先后的问题示例探讨的使用技巧和注意事项,需要的朋友参考一下

有时候在一个业务事件处理流程上,可能会遇到点击了一个按钮或者其他事件触发了一个动作

需要执行两个以上的Ajax请求,但是可能要顾虑到Ajax请求执行的先后顺序,有时候Ajax请求顺序出问题,会导致各种问题

例如现在有两个ajax事件,分别为ajax1 ,ajax2

一个叫做main的方法调用执行入口

1.

function main(){
ajax1(data,callback);
ajax2(data,callback);
}

如果我们按照上面的方法去执行,表面上看似乎是让ajax1先执行,ajax2后执行。如果不仔细想,有些人会认为ajax1先执行完,之后才会执行ajax2.事实上真的会如此吗?

答案是 不一定 。当然对于有多个ajax请求对执行返回顺序没要求的情况,我们不需要过多考虑谁先执行,谁先返回的
那要是考虑ajax事件执行先后顺序以及返回顺序呢

要是这样那怎么解决ajax事件的执行返回先后顺序呢

当然现在你应该会想到ajax回调函数,Good,这是一个好主意
现在按这种思路改变一下方法,方法如下

function main(){
ajax1( data , ajax2( ) );
}

这样看起来,你是不是觉得Very Good呢?真的吗?真的是Very Good吗?

Maybe,But in some case ,这样写可能有些不方便,当然也许你可能不会遇到,但是我遇到了一种比较特殊的情况
比如下面这种可能

function main(){
aa(data);
ajax1(data,callback);
}

function aa(val){
var data=val+"";//这里是对传入数据进行修改,封装,当然这里是随便写的
ajax2(data,ajax2Callback);
}

function ajax2Callback(){
console.log("=====回调函数ajax2Callback()执行========");
console.log("=====这里正在执行ajax执行完毕后必须执行的操作========");
}

你认为这种情况可以满足ajax2在ajax1先执行并且先执行完毕吗

仔细想想你会发现得到答案

No!
Now ,How to solve this proplem . How to make sure ajax2 finished before ajax1 .

当然,你可能会说,这不简单,把ajax1的调用放进ajax2方法回调方法ajax2Callback的最后面

不得不承认这是一种解决方案,但是如果是一个很古老的项目,已经做了好几年的项目了。里面调用复杂,要尽量去避免修改以前的底层方法,也许你为了修改这个bug,就这样简单解决了,你可能又会创造多个bug.

那到底还有没有好的方法去解决了?

Sure,solve it easy .但是工作经验不足的人很少会一下想到,只会用前面的办法草草解决问题,不管三七二十一。

而我采用了一种比较笨的方法,而且还存在一定问题,使用了setTimeOut定时器执行一次,但是问题想必大家都知道,谁知道这个Ajax会执行多久了,还好有大神指导了下我,
还记得对数组排序吗,说道这个,也许你会好奇,这与数组排序有啥关系。下面会告诉你答案

代码说明一切:

function main(){
var temp=ajax2Callback;
ajax2Callback=function(){
temp();
ajax1(data,callback);
}
aa(data);
ajax2Callback=temp; 
}

function aa(val){
var data=val+"";//这里是对传入数据进行修改,封装,当然这里是随便写的
ajax2(data,ajax2Callback);
}

function ajax2Callback(){
console.log("=====回调函数ajax2Callback()执行========");
console.log("=====这里正在执行ajax执行完毕后必须执行的操作========");
}

看出来没,是不是很有趣,没有修改最低层的方法,仅仅修改了main方法,是不是很像数组排序里的当我们比较两个值大小时,不管你用冒泡排序,还是快速排序,是不是都设置了一个临时变量去存储值。当然排序比较大小时,你可以没必要设置临时变量,仅仅用一个^运算符去做赋值比大小,甚至你可以偷懒到直接调用系统的Arrays.sort()方法,当然这都可以

function changeSearchContactType(obj)
{
if (!obj)
{
return;
}

var contactType = obj.value;

var origRenderTemplate = renderTemplate;
renderTemplate = function(data)
{
origRenderTemplate(data);
ajaxAnywhere.submitAJAX('setSearchContactType');
}
var result = TemplateHelper.changeSearchContactTemplate(contactType, contactUIUID);
renderTemplate = origRenderTemplate;
return result;
}
 类似资料:
  • 本文向大家介绍关于ajax的多次请求问题,包括了关于ajax的多次请求问题的使用技巧和注意事项,需要的朋友参考一下 我们在用ajax请求数据时,可能会遇到一次点击多次触发的可能。 (比如说:ajax 的 onreadystatechange 事件就会触发多次;这是因为 onreadystatechange 是一个事件句柄。 它的值 (state_Change) 是一个函数的名称,当 XMLHttp

  • 在一些请求中,我们会做一些日志的推送、用户数据的统计等和返回给终端数据无关的操作。而这些操作,即使你用异步非阻塞的方式,在终端看来,也是会影响速度的。这个和我们的原则:终端请求,需要用最快的速度返回给终端,是冲突的。 这时候,最理想的是,获取完给终端返回的数据后,就断开连接,后面的日志和统计等动作,在断开连接后,后台继续完成即可。 怎么做到呢?我们先看其中的一种方法: local response

  • 例子是: 相关规则是: 将左值到右值的转换应用于表达式E时 E未进行潜在评估,或 未访问引用对象中包含的值。 我对表达式表示怀疑,它指出未使用。 根据规则: 表达式E的一组潜在结果定义如下: 如果E是一个id表达式([expr.prim.id]),则该集合只包含E。 根据项目符号3,表达式的潜在结果是本身,而确实是的一个成员,这是的潜在结果。然而,我不同意不使用odr的说法。 根据这条规则: ba

  • 问题内容: (做了很多修改,因为它是类的一部分,等等。) 目前,这有点让人讨厌,因为计时器的使用似乎很垃圾。我会使用$ .when和$ .done,但是我不知道可能有多少房间,所以我不知道什么时候放什么。 如何确保仅在所有AJAX请求返回后才调用run_the_rest_of_the_app()? 问题答案: 在进行AJAX调用之前, 完成AJAX调用后(在回调中):

  • 本文向大家介绍关于jQuery判断元素是否存在的问题示例探讨,包括了关于jQuery判断元素是否存在的问题示例探讨的使用技巧和注意事项,需要的朋友参考一下 是这样的,最近做jQuery训练时遇到jQuery判断元素是否存在时出现问题. 题目如下:请在"选择按钮3"后面,添加Id=rad4,处于选择状态的,之后文字为"选择按钮4"的HTML控件,只能添加一次(自由选择使用js原生或JQuery实现

  • 本文向大家介绍关于ajax网络请求的封装实例,包括了关于ajax网络请求的封装实例的使用技巧和注意事项,需要的朋友参考一下 实例代码: 以上这篇关于ajax网络请求的封装实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。