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 Promise function 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 either console.info(1); }).fail( function () { //error either console.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.