Promise前世今生
瀏覽器事件模型
????在瀏覽器中鸥印,JavaScript作為單線程運(yùn)行;另外坦报,對(duì)UI線程操作的安全性考慮库说,JavaScript和UI線程也處于同一個(gè)線程中。因此對(duì)于長(zhǎng)時(shí)間的耗時(shí)操作片择,將會(huì)阻塞UI的響應(yīng)潜的。為了更好的UI體驗(yàn),應(yīng)該盡量的避免JavaScript中執(zhí)行較長(zhǎng)耗時(shí)的操作或者是長(zhǎng)時(shí)間I/O阻塞的任務(wù)字管。所以在瀏覽器中的大多數(shù)任務(wù)都是異步(無(wú)阻塞)執(zhí)行的啰挪。在HTML5中引入了新的組件-Web Worker,它可以在JavaScript線程以外執(zhí)行這些任務(wù)嘲叔,而不阻塞當(dāng)前UI線程亡呵。
瀏覽器中的事件循環(huán)模型
????由于瀏覽器的這種內(nèi)部事件循環(huán)機(jī)制,JavaScript以callback回調(diào)的方式來(lái)處理事件任務(wù)硫戈。因此無(wú)所避免的對(duì)于多個(gè)的JavaScript異步任務(wù)的處理锰什,將會(huì)遇見(jiàn)”callback hell",使得這類代碼及其不可讀和難易維護(hù),在視覺(jué)上,回調(diào)金字塔會(huì)讓你的代碼最終超過(guò)屏幕的寬度歇由。***更重要的的是卵牍,callback剝奪了return 和throw能力,剝奪我們?cè)跅I蠄?zhí)行代碼的能力沦泌。
Promise從天而降
Promiese解決 多異步callback問(wèn)題而誕生糊昙,解決了代碼縮進(jìn)的問(wèn)題
那什么是Promise呢?
Promise在英語(yǔ)中語(yǔ)義為:”承諾“,它表示如A調(diào)用一個(gè)長(zhǎng)時(shí)間任務(wù)B的時(shí)候谢谦,B將返回一個(gè)”承諾“給A释牺,A不用關(guān)心整個(gè)實(shí)施的過(guò)程,繼續(xù)做自己的任務(wù)回挽;當(dāng)B實(shí)施完成的時(shí)候没咙,會(huì)通過(guò)A,并將執(zhí)行A之間的預(yù)先約定的回調(diào)千劈。而deferred在英語(yǔ)中語(yǔ)義為:”延遲“祭刚,這也說(shuō)明promise解決的問(wèn)題是一種帶有延遲的事件,這個(gè)事件會(huì)被延遲到未來(lái)某個(gè)合適點(diǎn)再執(zhí)行墙牌。
Promise結(jié)構(gòu)
Promise設(shè)計(jì)規(guī)范--(https://promisesaplus.com)
1.Promise 對(duì)象有三種狀態(tài): Pending – Promise對(duì)象的初始狀態(tài)涡驮,等到任務(wù)的完成或者被拒絕;Fulfilled – 任務(wù)執(zhí)行完成并且成功的狀態(tài)喜滨;Rejected – 任務(wù)執(zhí)行完成并且失敗的狀態(tài)捉捅;
2.Promise的狀態(tài)只可能從“Pending”狀態(tài)轉(zhuǎn)到“Fulfilled”狀態(tài)或者“Rejected”狀態(tài),而且不能逆向轉(zhuǎn)換虽风,同時(shí)“Fulfilled”狀態(tài)和“Rejected”狀態(tài)也不能相互轉(zhuǎn)換棒口;
3.Promise對(duì)象必須實(shí)現(xiàn)then方法,then是promise規(guī)范的核心辜膝,而且then方法也必須返回一個(gè)Promise對(duì)象无牵,同一個(gè)Promise對(duì)象可以注冊(cè)多個(gè)then方法,并且回調(diào)的執(zhí)行順序跟它們的注冊(cè)順序一致
4.then方法接受兩個(gè)回調(diào)函數(shù)厂抖,它們分別為:成功時(shí)的回調(diào)和失敗時(shí)的回調(diào)合敦;并且它們分別在:Promise由“Pending”狀態(tài)轉(zhuǎn)換到“Fulfilled”狀態(tài)時(shí)被調(diào)用和在Promise由“Pending”狀態(tài)轉(zhuǎn)換到“Rejected”狀態(tài)時(shí)被調(diào)用。
Promise流程圖如下:
Promise將原來(lái)回調(diào)地獄中的回調(diào)函數(shù)验游,從橫向式增加巧妙的變?yōu)榱丝v向增長(zhǎng)。以鏈?zhǔn)降娘L(fēng)格保檐,縱向的書寫耕蝉,使得代碼更加的可讀和易于維護(hù)。
Promise高級(jí)技巧要點(diǎn)
1.多個(gè)異步任務(wù)的串行處理
2.多個(gè)異步任務(wù)的并行處理
3.統(tǒng)一調(diào)用接口
4.延遲任務(wù)的Promise DSL語(yǔ)義化封裝
5.利用Promise來(lái)實(shí)現(xiàn)管道式AOP攔截
Promise使用JS常見(jiàn)錯(cuò)誤
移步這里---(http://efe.baidu.com/blog/promises-anti-pattern/)
期待
不錯(cuò)的iOS--PromiseKit框架夜只,傳送門--(https://github.com/mxcl/PromiseKit)
JS庫(kù)看這里--(https://github.com/calvinmetcalf/lie)
下一篇垒在,讀源碼,學(xué)習(xí)設(shè)計(jì) iOS端的Promise
參考文檔
1.MSN
3.http://www.cnblogs.com/whitewolf/p/promise-best-practice.html
4.http://andyshora.com/promises-angularjs-explained-as-cartoon.html