如果doA失敗,它的Promise會被拒絕,處理鏈上的下一個onRejected會被調(diào)用,在這個例子中就是匿名函數(shù)function(error){}。比起原始的回調(diào)方式,不需要在每一步都對異常進行處理。這生了不少事。 以上只是對于Promise概念的簡單陳述,Promise擁有許多不同規(guī)范建議(A,A+,B,KISS,C,D等),名字(Future,Promise,Defer),和開源實現(xiàn)。大家可以參考一下的這些鏈接。
Non-Promise下面列出了其它的一些開源的庫,也可以幫助解決Javascript中異步編程所遇到的諸多問題,它們的解決方案各不相同,我這里就不一一介紹了。大家有興趣可以去看看或者試用一下。 Non-3rd Party
其實,為了解決Javascript異步編程帶來的問題,不一定非要使用Promise或者其它的開源庫,這些庫提供了很好的模式,但是你也可以通過有針對性的設(shè)計來解決。 比如,對于層層回調(diào)的模式,可以利用消息機制來改寫,假定你的系統(tǒng)中已經(jīng)實現(xiàn)了消息機制,你的code可以寫成這樣:
這樣我們就把嵌套的異步調(diào)用,改寫成了順序執(zhí)行的事件處理。 更多的方式,請大家參考這篇文章,它提出了解決異步的五種模式:回調(diào)、觀察者模式(事件)、消息、Promise和有限狀態(tài)機(FSM)。 下一代Javscript對異步編程的增強ECMAScript6下一代的Javascript標準Harmony,也就是ECMAScript6正在醞釀中,它提出了許多新的語言特性,比如箭頭函數(shù)、類(Class)、生成器(Generator)、Promise等等。其中Generator和Promise都可以被用于對異步調(diào)用的增強。 Nodejs的開發(fā)版V0.11已經(jīng)可以支持ES6的一些新的特性,使用node --harmony命令來運行對ES6的支持。 co、Thunk、Koakoa是由Express原班人馬(主要是TJ)打造,希望提供一個更精簡健壯的nodejs框架。koa依賴ES6中的Generator等新特性,所以必須運行在相應(yīng)的Nodejs版本上。 利用Generator、co、Thunk,可以在Koa中有效的解決Javascript異步調(diào)用的各種問題。 co是一個異步流程簡化的工具,它利用Generator把一層層嵌套的調(diào)用變成同步的寫法。
通過co可以把異步的fs.readFile當(dāng)成同步一樣調(diào)用,只需要把異步函數(shù)fs.readFile用閉包的方式封裝。 利用Thunk可以進一步簡化為如下的code, 這里Thunk的作用就是用閉包封裝異步函數(shù),返回一個生成函數(shù)的函數(shù),供生成器來調(diào)用。
利用co可以串行或者并行的執(zhí)行異步調(diào)用。 串行
并行
總結(jié)異步編程帶來的問題在客戶端Javascript中并不明顯,但隨著服務(wù)器端Javascript越來越廣的被使用,大量的異步IO操作使得該問題變得明顯。許多不同的方法都可以解決這個問題,本文討論了一些方法,但并不深入。大家需要根據(jù)自己的情況選擇一個適于自己的方法。 同時,隨著ES6的定義,Javascript的語法變得越來越豐富,更多的功能帶來了很多便利,然而原本簡潔,單一目的的Javascript變得復(fù)雜,也要承擔(dān)更多的任務(wù)。Javascript何去何從,讓我們拭目以待。 |
|
來自: 集微筆記 > 《JavaScript》