baowp 发表于 2013-1-29 11:20:52

浅析jquery1.5之Deferred

<div class="Section0"> 
    jquery1.5最大的改进是加入了Deferred,它的出现,使函数的回调方便很多,取代了网页加载完成后回调的函数数组,与重写后的ajax方法的返回实例结合.
    确切地说,Deferred是由两个_Deferred实例组成,一个用于成功解决后的回调(deferred),一个用于失败返回后的回调(failDeferred),其中failDeferred所属函数被改了名字注册入deferred.
jQuery.Deferred()返回实例deferred.
jQuery.extend(deferred, {fail : failDeferred.done,rejectWith : failDeferred.resolveWith,reject : failDeferred.resolve,isRejected : failDeferred.isResolved})   DOM加载后回调的readyList只是一个_Deferred的实例.
_Deferred也只是对于数组的封装,可将需要回调的函数注册进入,并提供几个可操作的函数
看下面一个例子:

// Create a Deferred and return its Promisefunction asyncEvent() {var dfd = jQuery.Deferred();dfd.done(function() {console.info(1)}).done([ function() {console.info(2)}, function() {console.info(3)} ]).fail(function() {console.info(-1)});setTimeout(function() {dfd.resolve("hurray");}, 1100);setTimeout(function() {dfd.reject("sorry");}, 1200);return dfd.promise(); // 实际上是 dfd 的部分复制 , 也可以返回 dfd, 但不推荐}// Attach a done and fail handler for the asyncEvent$.when(asyncEvent()).then(function(status) {console.info(status + ', things are going well');}, function(status) {console.info(status + ', you fail this time');});  
ajax返回实例与deferred结合后,可以写成

$.ajax({url :"a.html"}).done( function () { //success eitherconsole.info(1);}).fail( function () { //error eitherconsole.info(2)}).complete( function () {console.info(3)})   
以下是jquery官方对于api的解释
deferred. done ()Add handlers to be called when the Deferred object is resolved.deferred.fail()Add handlers to be called when the Deferred object is rejected.deferred.isRejected()Determine whether a Deferred object has been rejected.deferred.isResolved()Determine whether a Deferred object has been resolved.deferred.promise()Return a Deferred's Promise object.deferred.reject()Reject a Deferred object and call any failCallbacks with the given args.deferred.rejectWith()Reject a Deferred object and call any failCallbacks with the given context and args.deferred.resolve()Resolve a Deferred object and call any doneCallbacks with the given args.deferred.resolveWith()Resolve a Deferred object and call any doneCallbacks with the given context and args.deferred.then()Add handlers to be called when the Deferred object is resolved or rejected.  
页: [1]
查看完整版本: 浅析jquery1.5之Deferred