jQuery的Deferred对象

jQuery.Deferred()

      使用Deferred增强jQuery的Callbacks能力。Deferred提供几种增强方法来管理和调用回调函数。jQuery Deferred的设计是基于CommonJS Promises/A的设计。

        创建一个延时对象Deferred。Deferred对象拥有三个状态resolved, reject, pending。三个状态分别对应三个触发函数deferred.resolve()/deferred.resolveWith(),deferred.reject()/deferred.rejectWith(),  deferred.notify()/deferred.notifyWith()。对象的状态可以通过deferred.state()对象进行判断,1.7之前判断三种状态分别使用 deferred.isResolved(),  deferred.isRejected(),对pendind状态没有专门的函数来判断,pending状态就是非resolved和rejected状态时deferred的状态。

      可以使用deferred.done(),deferred.fail()添加回调函数,回调函数在调用resolve(),reject()的时候执行。

      可以使用deferred.progress()添加回调函数,deferred.notify()/notifyWith()时执行。

      使用jQuery API的大多数场景会返回一个Deferred或者Promise-compatible对象,譬如jQuery.ajax(),jQuery.when(),此时你只需要使用then(),done(),fail()方法项Deferred队列中添加回调函数即可,创建Deferred的内部API或者代码结构会在某个时刻自动调用他生成的deferred对象的resolve()或者reject()方法,引发相应的回调函数执行。

Deferred.promise()

      deferred.promise() 允许异步函数阻止其他代码干扰其内部请求的进度或状态。

        promise承诺deferred对象的状态不会被调用者改变,一个promise拥有deferred的添加回调函数的功能和查看deferred状态的功能,不具备改变deferred状态的功能。简单的说就是promise对外暴露deferred对象的then, done, fail, always, pipe, progress, state , promise 方法,不对外暴露resolve, reject, notify, resolveWith, rejectWith, notifyWith方法。可以对调用者返回promise,使其只能添加各种状态需要执行的函数和查看deferred的状态。deferred对象自己来操作状态的触发。一下是官方的两个典型示例:

         

// 对调用者暴露promise,使其只能添加各种状态需要执行的函数和查看deferred的状态。deferred对象自己来操作状态的触发
function
asyncEvent() { var dfd = jQuery.Deferred(); // Resolve after a random interval setTimeout(function() { dfd.resolve( "hurray" ); }, Math.floor( 400 + Math.random() * 2000 ) ); // Reject after a random interval setTimeout(function() { dfd.reject( "sorry" ); }, Math.floor( 400 + Math.random() * 2000 ) ); // Show a "working..." message every half-second setTimeout(function working() { if ( dfd.state() === "pending" ) { dfd.notify( "working... " ); setTimeout( working, 500 ); } }, 1 ); // Return the Promise so caller can't change the Deferred return dfd.promise(); } // Attach a done, fail, and progress handler for the asyncEvent $.when( asyncEvent() ).then( function( status ) { alert( status + ", things are going well" ); }, function( status ) { alert( status + ", you fail this time" ); }, function( status ) { $( "body" ).append( status ); } );

     

        如果提供操作对象,deferred.promise()只给对象添加方法返回原对象,而不是重新创建新对象。这样可以给存在的对象应用Promise行为能力。

        如果你创建一个Deferred,最好保存一个Deferred的引用以便后面操作他的resolve,reject方法。对调用者只返回Promise对象,通过deferred.promise()方法,调用者可以在其上注册回调函数以及查看当前deferred(延时对象)的状态。

// 对存在的对象应用promise
//
Existing object var obj = { hello: function( name ) { alert( "Hello " + name ); } }, // Create a Deferred defer = $.Deferred(); // Set object as a promise defer.promise( obj ); // Resolve the deferred defer.resolve( "John" ); // Use the object as a Promise obj.done(function( name ) { obj.hello( name ); // Will alert "Hello John" }).hello( "Karl" ); // Will alert "Hello Karl"

jQuery.when()

jQuery.then()

          jQuery.then()是jQuery.pipe()的替代者。

原文地址:https://www.cnblogs.com/hengwu/p/9723036.html