deferred.promise()
返回一个Deferred的Promise对象。
deferred.promise([target ])
- target类型: Object。绑定 promise 方法的对象。
deferred.promise()
方法允许一个异步函数阻止那些干涉其内部请求的进度(progress)或状态(status)的其它代码。Promise (承诺)对象仅会暴露那些需要绑定额外的处理或判断状态的延迟方法(then
,done
,fail
,always
,pipe
,progress
,state
,和promise
)时,并不会暴露任何用于改变状态的延迟方法(resolve
,reject
,notify
,resolveWith
,rejectWith
,和notifyWith
).
如果提供target
参数,deferred.promise()
会将事件绑定到该参数上,然后返回该对象,而不是创建一个新的对象。这个方法可以用于在已经存在的对象上绑定 Promise 行为的情况。
如果您要创建一个Deferred(延迟),并且保持这个Deferred(延迟)的引用,以便它可以在一些点来解决或拒绝。通过deferred.promise()
定义Promise(承诺)对象即可。这样的话,其它的代码就可以注册回调函数或检查当前状态。
例子
创建一个延迟对象,并设定两个延时时间是随机的定时器,分别用于受理(resolve)和拒绝(reject)延迟对象。无论哪一个先执行,都会调用其中一个回调函数。而另一个定时器则不会产生任何效果,因为在最先调用的那个定时器处理中,延迟对象已经处于完成状态(resolved 或 rejected 状态)。同时,还会设定一个定时器进度(progress)通知函数,用于进度通知处理,并在文档的"body"中显示"working..."。
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 Deferredreturn 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 ); } );
Use the target argument to promote an existing object to a Promise:
// Existing objectvar 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"