大多情況下,promise作為一個模型,提供了一個在軟件工程中描述延時(或將來)概念的解決方案。它背后的思想我們已經介紹過:
不是執行一個方法,然后阻塞應用程序等待結果返回,而是返回一個promise對象來滿足未來值。
這樣看來,Promise/A只是一種規范,Deferred可以看作這種規范的具體實現,旨在提供通用的接口,用來簡化異步編程難度,說白了就是:
一個可鏈式操作的對象,提供多個回調函數的注冊,以及回調列隊的回調,并轉達任何異步操作成功或失敗的消息。
jQuery.Deferred()背后的設計理念來自 CommonJS Promises/A , jQuery.Deferred()基于這個理念實現,但并沒有完全遵循其設計, 它代表了一種可能會長時間運行而且不一定必須完整的操作的結果,簡單的描述下規范中定義的“Promise”。
promise模式在任何時刻都處于以下三種狀態之一:
未完成(unfulfilled) 已完成(resolved) 拒絕(rejected)
CommonJS Promise/A 標準這樣定義的,promise對象上的then方法負責添加針對已完成和拒絕狀態下的處理函數。then方法會返回另一個promise對象,這樣可以形成“管道”風格。
看看jQuery的Deferred源碼中對動作接口的定義:
[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], [ "notify", "progress", jQuery.Callbacks("memory") ]
Deferred中定義的動作是非常多的,抽象的看其實可以類似一種觀察者模式的實現。
觀察者模式中的訂閱方法:
Done (操作完成) Fail (操作失敗) Progress (操作進行中
觀察中模式中的發布方法:
resolve(解決) reject(拒絕) notify(通知)
而且還提供了可以定義運行時的this對象的fire,fireWith,所以擴展了3個可以定義上下文的的接口:
resolveWith rejectWith notifyWith
所以按照這樣的規范,我們的使用就應該是這樣:見右邊代碼。
請驗證,完成請求
由于請求次數過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報