Query Deferred主是是为了解决异步而生。也许我们对于Deferred可能不熟悉,但是我们必定对promise熟悉,这两着之间有紧密的联系又或者说deffered包含promise的所有方法,但是为什么还会有promise呢?我们接下来会介绍。
我们来看源码:
我们可以看到这是一个工厂函数,结果返回一个组装成的对像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方法
接下来有一句代码是'promise.promise( deferred )';这句代码是把promise对像所有的方法赋给deferred对像
我们看到promise是不是没有触发执行的方法啊,所以它在是改变不了状态的,所以我们一般是用promise做异步编程的工作的。