美文网首页
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