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