jQuery中deferred对象的使用(二)
接上一回的內(nèi)容,漏了一個(gè)always()方法,參數(shù)也是回調(diào)函數(shù),與done和fail不同的是,無論任何情況都執(zhí)行always方法中的回調(diào)。
deferred對(duì)象的使用(二)
deferred對(duì)象不光可以用在jquery的ajax方法中,他提供了一系列的接口,使它的通用型大大提高。
比如有這樣一個(gè)耗時(shí)比較久的方法
function a(){function b(){alert('start');} setTimeout(b, 3000); }如果要在這個(gè)方法之后執(zhí)行某個(gè)回調(diào),就不能用$.when()了,因?yàn)楫?dāng)$.when()的參數(shù)不為deferred對(duì)象是會(huì)直接調(diào)用done或者always中的回調(diào)函數(shù)。
這個(gè)時(shí)候就要使用deferred對(duì)象的其他方法了,還是上面的方法,做一些改寫
function a(){var def = $.Deferred(); // 創(chuàng)建deferred對(duì)象 function b(){alert('start');def.resolve(); // 改變deferred對(duì)象的狀態(tài) } setTimeout(b, 3000); return def; }$.when(a()).done(function(){alert("It's callback"); });分析一下:
1. $.Deferred()方法會(huì)創(chuàng)建一個(gè)deferred對(duì)象
2. def.resolve()會(huì)改變deferred對(duì)象的狀態(tài),deferred對(duì)象有三種狀態(tài),未完成,成功,失敗。
它有resolve()和reject()兩個(gè)方法,resolve方法可以把對(duì)象狀態(tài)改為成功,reject方法可以把狀態(tài)改為失敗。
又有以上的寫法會(huì)出現(xiàn)問題,返回的deferred對(duì)象可以被外部改變狀態(tài),所以還提供了一個(gè)promise()方法,這個(gè)方法會(huì)在deferred對(duì)象的基礎(chǔ)上返回一個(gè)新的deferred對(duì)象,不同的是,返回的對(duì)象只存在可被觀察到狀態(tài),而不具備可改變其狀態(tài)的方法,類似返回了一個(gè)只讀的deferred對(duì)象。
所以同樣的例子可以改寫成這樣
function a(){var def = $.Deferred(); // 創(chuàng)建deferred對(duì)象 function b(){alert('start');def.resolve(); // 改變deferred對(duì)象的狀態(tài) } setTimeout(b, 3000); return def.promise(); }$.when(a().reject()).done(function(){ // reject()方法無效alert("It's callback"); });?
轉(zhuǎn)載于:https://www.cnblogs.com/fxxkhigh/p/5535566.html
總結(jié)
以上是生活随笔為你收集整理的jQuery中deferred对象的使用(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ANTLR 4的C#实例
- 下一篇: 退一步 - 王阳明的心学智慧