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"