deferred.promise()
分类:Deferred对象
deferred.promise( [target ] )
描述:返回某个Deferred对象的Promise对象。
deferred.promise()
方法允许传入一个同步函数,以防止别的代码干预它的内部请进程或状态。Promise对象只会泄露了Deferred对象用来附加额外的处理函数或确定状态的方法(.then()
、.done()
、.always()
、.pipe()
、.progress()
、.state()
和.promise()
),但是不会泄露用来改变Deferred对象的状态的方法(.resolve()
、.reject()
、.notify()
、.resolveWith()
、.rejectWith()
和.notifyWith()
)。
如果提供了target
,则deferred.promise()
将把该方法附加到target
上,并返回该对象,而不是创建一个新对象。这个方法可以用来把Promise行为附加到一个已经存在的对象上。
如果你正在创建一个Deferred对象,为这个Deferred对象保存了个引用,从而它可以在某一时点上被解决或被拒绝。利用deferred.promise()
方法可以只返回Promise对象,从而别的代码可以注册一个回调函数或者检查当前状态。
欲得更多信息,参见Deferred对象。
示例
创建一个Deferred对象,并分别向解决该Deferred对外和拒绝该Deferred对象设置两个基于定时器的函数,定时在一个随机时长后面。无论哪个引发了第一个“wins”,都会调用回调函数之一。第二个超时没有效果,因为Deferred已经在第一个超时操作中完成了(要么是被解决状态要么是被拒绝状态)。同样,设置一个基于定时器的进程通知函数,并调用一个进程处理函数,向document.body添加“working...”。
function asyncEvent() { var dfd = jQuery.Deferred(); // 在一个随机时长之后解决Deferred对象 setTimeout(function() { dfd.resolve( "hurray" ); }, Math.floor( 400 + Math.random() * 2000 ) ); // 在一个随机时长之后拒绝Deferred对象 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 ); // 返回Promise对象,从而调用器不能改变Deferred对象了 return dfd.promise(); } // 针对asyncEvent附加done、fail、progress处理函数 $.when( asyncEvent() ).then( function( status ) { alert( status + ", things are going well" ); }, function( status ) { alert( status + ", you fail this time" ); }, function( status ) { $( "body" ).append( status ); } );
使用目标参数以将一个已有的对象转变成Promise对象:
// Existing object var obj = { hello: function( name ) { alert( "Hello " + name ); } }, // 创建一个Deferred对象 defer = $.Deferred(); // 把一个对象设置为promise对象 defer.promise( obj ); // 解决该Deferred对象 defer.resolve( "John" ); // 把该对象用作一个promise对象 obj.done(function( name ) { obj.hello( name ); // Will alert "Hello John" }).hello( "Karl" ); // Will alert "Hello Karl"