jquery的Deferred

Query Deferred主是是为了解决异步而生。也许我们对于Deferred可能不熟悉,但是我们必定对promise熟悉,这两着之间有紧密的联系又或者说deffered包含promise的所有方法,但是为什么还会有promise呢?我们接下来会介绍。  

我们来看源码: 

jquery的Deferred

我们可以看到这是一个工厂函数,结果返回一个组装成的对像deferred,那么接下来我们看一下这个返回的deferred对像都有哪些方法。

// Add list-specific methods
jQuery.each( tuples, function( i, tuple ) {
   var list = tuple[ 2 ],
   stateString = tuple[ 3 ];

   // promise[ done | fail | progress ] = list.add
   promise[ tuple[1] ] = list.add;

   // Handle state
   if ( stateString ) {
      list.add(function() {
      // state = [ resolved | rejected ]
      state = stateString;

      // [ reject_list | resolve_list ].disable; progress_list.lock
   }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
}

   // deferred[ resolve | reject | notify ]
   deferred[ tuple[0] ] = function() {
        deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
       return this;
  };
  deferred[ tuple[0] + "With" ] = list.fireWith;
});

  这里遍历了tuples对像实现了:  

  - list对像等于二维数组tuples中的callbacks对像  

  - promise对像添加了三个方法done,fail,progress且都等于callbacks的add方法  

  - stateString等于状态“resolved”或“rejected”  

  - deferred对像添加了6个方法resolve,reject,notify,resolveWith,rejectWith,notifyWith且等于callbacks的    fireWith方法  

jquery的Deferred

接下来有一句代码是'promise.promise( deferred )';这句代码是把promise对像所有的方法赋给deferred对像

jquery的Deferred

我们看到promise是不是没有触发执行的方法啊,所以它在是改变不了状态的,所以我们一般是用promise做异步编程的工作的。