1.功能描述:用jquery进来初始化多个查询条件,比如日期(默认当前日期),省与地市(默认省会城市)等很多条件后,等这些条件全部加载完成后再执行查询,然后页面展示查询结果。
2.发现问题:因为jquery的异步性,导致初始化的条件还没有加载完成(包括省市联动等),就直接执行了查询操作,导致查询的结果有问题。3.需求方案:如何等待所有异步的初始化条件全部加载完成后,再执行查询。jquery异步判断异步是否完成异步与同步关联

解决方案 »

  1.   

    var finish=0,count=3;
    $.get(url1,function(){   
      if(finish==count){
           //执行全部加载后方法
      }
    });
    $.get(url2,function(){   
      if(finish==count){
           //执行全部加载后方法
      }
    });
    $.get(url3,function(){   
      if(finish==count){
           //执行全部加载后方法
      }
    })或者关联紧的改成同步方式
      

  2.   

    给2个笨方法
    1.异步嵌套(执行一个AJAX后 等待完成 执行下一个),当为最后一个时就执行你的方法
    2.给予相应标识,只有标识为真时 则标识请求完成 执行你的方法,可以去启动一个计时器 循环去判断标识状态
      

  3.   

    如果是jQuery1.5以上,ajax类函数返回的是deferred对象,jQ有一个方法叫when:
    $.when($.get(url1),$.get(url2),$.get(url3)).done(function(){/*code here*/});
    如果3次get有先后顺序,可以用pipe:
    $.get(url1).pipe($.get(url2)).pipe($.get(url3)).done(function(){/*code here*/});
    1.8以上,pipe被弃用,改为then:
    $.get(url1).then($.get(url2)).then($.get(url3)).done(function(){/*code here*/});
    意义很明显,先get url1 然后get url2 然后 get url3,做完了再执行done的内容。详情了解 jQuery Deferred.
      

  4.   

    以1.8版本以后的为例:function init() {
       var responseDatas = [];
       $.ajax({url:url1,dataType:'json'})
            .then(function(data){
                responseDatas.push(data);
            })
            .then($.ajax({url:url2,dataType:'json'}))
            .then(function(data){
                responseDatas.push(data); 
            })
            .then($.ajax({url:url3,dataType:'json'}))
            .done(function(data){
                responseDatas.push(data); 
                dealWithResponseDatas(responseDatas);
            });
    }
      

  5.   

    不行,ajax里的内容触发后就接着往下执行了,待执行到查询的方法时,说不定ajax的请求还没有返回结果呢。
      

  6.   


    $.ajax({
        async : false //设置成为 同步的  
    })在客户端  初始化时 给张gif   用户体验应该还行吧
      

  7.   


    同步的话,即使是gif动画,也是要卡住的。
    我刚刚试过了哦。
    time = new Date(); while(new Date(0 - time < 5000) ; 
    死循环5秒,结果页面上的gif动画都卡住了呢,5秒后又开始动了。
      

  8.   


    同步的话,即使是gif动画,也是要卡住的。
    我刚刚试过了哦。
    time = new Date(); while(new Date(0 - time < 5000) ; 
    死循环5秒,结果页面上的gif动画都卡住了呢,5秒后又开始动了。

    这样啊。
    用张比较漂亮的png  过渡吧
    5S以内的  延迟初始化 应该可以接受吧
      

  9.   


    默认需要ajax的状态都设置为1,每个ajax查询完成后设置其状态为非loading(如0),查询前检查所有ajax请求的状态是否都完成(所有状态都要为0),不完成就不查询
      

  10.   

    默认需要ajax的状态都设置为1,每个ajax查询完成后设置其状态为非loading(如0),查询前检查所有ajax请求的状态是否都完成(所有状态都要为0),不完成就不查询
    "不完成就不查询"是不对了,我要做的是一定要查询,只是等条件他们全部完成了,再查询哦
      

  11.   

    这个回去试试,但是想问下,“.then”这个是执行异步还是同步的?
    举个例子说明吧,想要(A异步,B异步,C异步)完成后,执行(D)。ABC之间顺序无所谓,但是D一定要等ABC三个全部完成
      

  12.   

    我举个例子说明我想要的吧:
    (A异步,B异步,C异步)完成后,执行(D)。ABC之间顺序无所谓,但是D一定要等ABC三个全部完成
      

  13.   

    我举个例子说明我想要的吧:
    (A异步,B异步,C异步)完成后,执行(D)。ABC之间顺序无所谓,但是D一定要等ABC三个全部完成
    前面 finish 忘 +1,这样写就是可以分开写,不用嵌套在一起var finish=0,count=3;
    $.get(url1,function(){ 
        
      if(++finish==count){
           //执行全部加载后方法
      }
    });
    $.get(url2,function(){   
      if(++finish==count){
           //执行全部加载后方法
      }
    });
    $.get(url3,function(){   
       
      if(++finish==count){
           //执行全部加载后方法
      }
    })
      

  14.   

    这个回去试试,但是想问下,“.then”这个是执行异步还是同步的?
    举个例子说明吧,想要(A异步,B异步,C异步)完成后,执行(D)。ABC之间顺序无所谓,但是D一定要等ABC三个全部完成
    .then方法的这个用法之前叫pipe,pipe的意思就是管道。Deferred对象可以注册done和fail,pipe方法可以帮我们对接上deferred对象,就像有一个水流,一截一截管子往上对接,水流过管子需要时间,但是那些我们可以不管,只需要知道最终流到哪了。.then还可以接上过滤网和处理设备,以便在途中对流过的水进行处理。既然没有顺序,用$.when可以这样。自从有了Deferred/Promise模式,妈妈再也不用担心我被一堆堆Callback绕晕了。
    var data1, data2;
    var request1 = $.get(url1);
    var request2 = $.get(url2);
    request1.done(function(data){data1 = data;});
    request2.done(function(data){data2 = data;});
    $.when(request1,request2).done(function(){
        console.log(data1,data2);
    });;
      

  15.   

    ajax本身不就有返回函数吗?在ajax的返回函数里写你之后的查询不就可以了。
      

  16.   

    ajax中的success 不就是成功返回后才开始执行么。。$.post 方法也是啊?   还是说没明白LZ的意思、、
      

  17.   

    我举个例子说明我想要的吧:
    (A异步,B异步,C异步)完成后,执行(D)。ABC之间顺序无所谓,但是D一定要等ABC三个全部完成
    前面 finish 忘 +1,这样写就是可以分开写,不用嵌套在一起var finish=0,count=3;
    $.get(url1,function(){ 
        
      if(++finish==count){
           //执行全部加载后方法
      }
    });
    $.get(url2,function(){   
      if(++finish==count){
           //执行全部加载后方法
      }
    });
    $.get(url3,function(){   
       
      if(++finish==count){
           //执行全部加载后方法
      }
    })
    有点意思了,代码可能要写复杂了点,但是貌似有那个意思
      

  18.   

    这个回去试试,但是想问下,“.then”这个是执行异步还是同步的?
    举个例子说明吧,想要(A异步,B异步,C异步)完成后,执行(D)。ABC之间顺序无所谓,但是D一定要等ABC三个全部完成
    .then方法的这个用法之前叫pipe,pipe的意思就是管道。Deferred对象可以注册done和fail,pipe方法可以帮我们对接上deferred对象,就像有一个水流,一截一截管子往上对接,水流过管子需要时间,但是那些我们可以不管,只需要知道最终流到哪了。.then还可以接上过滤网和处理设备,以便在途中对流过的水进行处理。既然没有顺序,用$.when可以这样。自从有了Deferred/Promise模式,妈妈再也不用担心我被一堆堆Callback绕晕了。
    var data1, data2;
    var request1 = $.get(url1);
    var request2 = $.get(url2);
    request1.done(function(data){data1 = data;});
    request2.done(function(data){data2 = data;});
    $.when(request1,request2).done(function(){
        console.log(data1,data2);
    });;

    如果有when,那这样就简单明了了。试试先
      

  19.   

    举个例子说明吧,想要(A异步,B异步,C异步)完成后,执行(D)。ABC之间顺序无所谓,但是D一定要等ABC三个全部完成
      

  20.   

    是的呢,这尼玛简直就是在写英语造句啊:
    请求1 完成时 执行XXX
    请求2 完成时 执行XXX
    当 请求1,请求2 都完成了的时候 执行XXX
      

  21.   

    个人觉得用一两个全局变量比ajax的判定更具有性能及可控性.