• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    关于多个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使用不同namespace的action的方法
    下一篇:json格式的Ajax提交示例代码
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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