返回值:Promisedeferred.promise([target])
返回延迟对象的 Promise 对象。
-
1.5 新增deferred.promise([target])
target (Object) 可选参数,绑定 promise 方法的对象。
deferred.promise()
方法允许一个异步函数阻止那些干涉其内部请求的进度(progress)或状态(status)的其它代码。Promise 仅会暴露那些需要绑定额外的处理或判断状态的延迟方法(then
, done
, fail
, always
,pipe
, progress
, 和 state
)时,并不会暴露任何用于改变状态的延迟方法(resolve
, reject
, notify
, resolveWith
, rejectWith
, 和 notifyWith
)。
如果提供了 target
参数,deferred.promise()
会将事件绑定到该参数上,并返回这个对象,而不是创建一个新的对象。这个方法可以用于在已经存在的对象上绑定 Promise 行为的情况。
如果你正在创建一个延迟对象,并保留了指向这个对象的引用,这样的话,在需要的时候,我们就可以受理(resolve)或拒绝(reject)这个对象。只需通过 deferred.promise()
,返回 Promise 对象即可。这样的话,其它的代码就可以注册回调函数或检查当前状态。
若要了解更多内容,请参阅如下文档 延迟对象。
示例:
创建一个延迟对象,并设定两个延时时间是随机的定时器,分别用于受理(resolve)和拒绝(reject)延迟对象。无论哪一个先执行,都会调用其中一个回调函数。而另一个定时器则不会产生任何效果,因为在最先调用的那个定时器处理中,延迟对象已经处于完成状态(resolved 或 rejected 状态)。同时,还会设定一个定时器进度(progress)通知函数,用于进度通知处理,并在文档的 "body" 中显示 "working..."。
jQuery 代码:
function asyncEvent(){
var dfd = new 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);
}
);
示例:
使用 target 参数,在已经存在的对象上绑定 Promise:
jQuery 代码:
// 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"