美文网首页
jquery 中的deferred和promise 实践

jquery 中的deferred和promise 实践

作者: c40f8df9338d | 来源:发表于2016-07-29 22:28 被阅读0次

    介绍jquery 的deferred由来

    它是jquery1.5版本的新出的功能,为了解决异步回调的问题。大概2011年就出来了。现在es6规范中的promise,基本和deferred对象是一个概念。

    定义deferred对象

       var deferred1 = $.Deferred();//这样就创建了一个deferred对象
       deferred.done(sucessfn);     //定义d1成功后的回调函数
       deferred.fail(failfn);              //定义d1失败后的回调函数
    

    每一个deferred对象,有三种状态

    1. 正在处理中:
    2. 成功状态:
    3. 失败状态:

    当deferred对象被resolve/reject触发之后,就会改变状态,然后调用不同状态下的函数。

        //从正在处理的状态变为成功状态,callback done,
        deferred1.resolve(); 
       //从正在处理的状态变为失败状态,callback fail,
      deferred1.reject();
    

    以上就是deferred的基本用法,简单说来。就是可以让我们认为控制一个对象成功失败的状态。看到这里,好像没觉得它有多牛逼。

    deferred对象解决了什么问题?~~

    1.ajax对象,易读性

    • jquery1.5版本重写了$.ajax对象,$.ajax的返回值全是deferred对象。用done和fail来表示成功或者失败。

        var deferred2 = $.ajax("test.html")
                         .done(function(){ alert("哈哈,成功了!"); })
                         .fail(function(){ alert("出错啦!"); });
      
    • 为一个deferred对象,添加多个回调处理函数,且按照添加的顺序执行

        deferred2.done(sucessfn 1) 
                 .done(sucessfn 2)
      
    • 解决异步金字塔回调 $.when()
      想想这样的业务场景,有三个及以上异步请求的时候,如何保证3个请求都成功之后,在执行一个函数呢?

        $.ajax({
              success: $.ajax({})   //只能通过回调成功的函数里,嵌套ajax请求
        })
        
        //通过计数器来实现,但是每个回调成功的函数,都要检查当前的计数
        var flag = 0;
        $.ajax({
              success: flag++  
                       if(flag == 3){
                                //3个请求已成功
                       }
        })
       //只有当两个ajax都成功的时候,才调用done的回调函数。
        $.when($.ajax1,$.ajax2)
         .done(f1)
         .fail(f2)
      

    特别注意:when函数,只接受deferred对象哦!!!!

    • 简单写法 then方法,直接把done状态和fail状态都写进去

        deferred1.then(donefunc,failfunc);
      

    相关文章

      网友评论

          本文标题:jquery 中的deferred和promise 实践

          本文链接:https://www.haomeiwen.com/subject/ihwzjttx.html