1. 程式人生 > >異步編程promise

異步編程promise

promise org 日記 vip com 打電話 同時 spa 時間限制

promise不是angular首創的,作為一種編程模式,它出現在……1976年,比js還要古老得多。promise全稱是 Futures and promises。具體的可以參見 http://en.wikipedia.org/wiki/Futures_and_promises 。

而在javascript世界中,一個廣泛流行的庫叫做Q 地址是https://github.com/kriskowal/q 而angular中的$q就是從它引入的。promise解決的是異步編程的問題,對於生活在同步編程世界中的程序員來說,它可能比較難於理解,這也構成了angular入門門檻之一,本文將用生活中的一個例子對此做一個形象的講解。

假設有一個家具廠,而它有一個VIP客戶張先生。

有一天張先生需要一個豪華衣櫃,於是,他打電話給家具廠說我需要一個衣櫃,回頭做好了給我送來,這個操作就叫$q.defer,也就是延期,因為這個衣櫃不是現在要的,所以張先生這是在發起一個可延期的請求。

同時,家具廠給他留下了一個回執號,並對他說:我們做好了會給您送過去,放心吧。這叫做promise,也就是承諾。

這樣,這個defer算是正式創建了,於是他把這件事記錄在自己的日記上,並且同時記錄了回執號,這叫做deferred,也就是已延期事件。

現在,張先生就不用再去想著這件事了,該做什麽做什麽,這就是“異步”的含義。

假設家具廠在一周後做完了這個衣櫃,並如約送到了張先生家(包郵哦,親),這就叫做deferred.resolve(衣櫃),也就是“已解決”。而這時候張先生只要簽收一下這個(衣櫃)參數就行了,當然,這個“郵包”中也不一定只有衣櫃,還可以包含別的東西,比如廠家宣傳資料、產品名錄等。整個過程中輕松愉快,誰也沒等誰,沒有浪費任何時間。

假設家具廠在評估後發現這個規格的衣櫃我們做不了,那麽它就需要deferred.reject(理由),也就是“拒絕”。拒絕沒有時間限制,可以發生在給出承諾之後的任何時候,甚至可能發生在快做完的時候。而且拒絕時候的參數也不僅僅限於理由,還可以包含一個道歉信,違約金之類的,總之,你想給他什麽就給他什麽,如果你覺得不會惹惱客戶,那麽不給也沒關系。

假設家具廠發現,自己正好有一個符合張先生要求的存貨,它就可以用$q.when(現有衣櫃)來把這個承諾給張先生,這件事就立即被解決了,皆大歡喜,張先生可不在乎你是從頭做的還是現有的成品,只會驚嘆於你們的效率之高。

假設這個家具廠對客戶格外的細心,它還可能通過deferred.notify(進展情況)給張先生發送進展情況的“通知”。

這樣,整個異步流程就圓滿完成,無論成功或者失敗,張先生都沒有往裏面投入任何額外的時間成本。

好,我們再擴展一下這個故事:

張先生這次需要做一個桌子,三把椅子,一張席夢思,但是他不希望今天收到個桌子,明天收到個椅子,後天又得簽收一次席夢思,而是希望家具廠做好了之後一次性送過來,但是他下單的時候又是分別下單的,那麽他就可以重新跟家具廠要一個包含上述三個承諾的新承諾,這就是$q.all(桌子承諾,椅子承諾,席夢思承諾),這樣,他就不用再關註以前的三個承諾了,直接等待這個新的承諾完成,到時候只要一次性簽收了前面的這些承諾就行了。

異步編程promise