通過以下兩篇博客就可以對deferred和promise有很深入的了解了。
JavaScript異步編程的Promise模式
http://www.infoq.com/cn/news/2011/09/js-promise
jQuery的deferred對象詳解
http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html
主要解決的問題:當一個異步依賴於另一個異步請求的結果時,或者某個操作需要等另外幾個操作都結束后才開始等。更強大的是從ajax操作擴展到了所有操作。動畫、定時中也常用
我能想到的一個案例:
在店鋪列表頁需要拉取店鋪的基本信息(名稱、主營、圖標等),同時需要從另一接口拉取每個店鋪的輔助信息(相符度星級、優惠活動信息等)。頁面計划先從第一個接口拉到數據后使用第一個模板填充基本信息顯示出來,再從第二個接口拉輔助信息並填充到已經生成的店鋪中,那么就會出現ajax回調嵌套。
Deferred對象就是jquery的回調函數解決方案,在jquery1.5版本前ajax返回一個XHR對象,1.5后返回defferred對象,可以進行鏈式操作
允許指定多個事件執行完后的回調函數,這些事件只要有一個失敗就只會執行fail()指定的回調。
deferred對象的最大優點,就是它把這一套回調函數接口,從ajax操作擴展到了所有操作。也就是說,任何一個操作----不管是ajax操作還是本地操作,也不管是異步操作還是同步操作----都可以使用deferred對象的各種方法,指定回調函數。
Query規定,deferred對象有三種執行狀態----未完成,已完成和已失敗。如果執行狀態是"已完成"(resolved),deferred對象立刻調用done()方法指定的回調函數;如果執行狀態是"已失敗",調用fail()方法指定的回調函數;如果執行狀態是"未完成",則繼續等待,或者調用progress()方法指定的回調函數(jQuery1.7版本添加)。
dtd.resolve()的意思是,將dtd對象的執行狀態從"未完成"改為"已完成",從而觸發done()方法。類似的,還存在一個deferred.reject()方法,作用是將dtd對象的執行狀態從"未完成"改為"已失敗",從而觸發fail()方法。
Promise::它代表了一種可能會長時間運行而且不一定必須完整的操作的結果。這種模式不會阻塞和等待長時間的操作完成,而是返回一個代表了承諾的(promised)結果的對象。
promise模式的使用需要恰當地設置promise對象,在對應的事件中調用狀態轉換函數,並且在最后返回promise對象。
主要函數: