一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

探索Javascript異步編程(2)

 集微筆記 2014-05-26

如果doA失敗,它的Promise會被拒絕,處理鏈上的下一個onRejected會被調(diào)用,在這個例子中就是匿名函數(shù)function(error){}。比起原始的回調(diào)方式,不需要在每一步都對異常進行處理。這生了不少事。

以上只是對于Promise概念的簡單陳述,Promise擁有許多不同規(guī)范建議(A,A+,B,KISS,C,D等),名字(Future,Promise,Defer),和開源實現(xiàn)。大家可以參考一下的這些鏈接。


如果你有選擇困難綜合癥,面對這么多的開源庫不知道如何決斷,先不要急,這還只是一部分,還有一些庫沒有或者不完全采用Promise的概念

Non-Promise

下面列出了其它的一些開源的庫,也可以幫助解決Javascript中異步編程所遇到的諸多問題,它們的解決方案各不相同,我這里就不一一介紹了。大家有興趣可以去看看或者試用一下。

Non-3rd Party

其實,為了解決Javascript異步編程帶來的問題,不一定非要使用Promise或者其它的開源庫,這些庫提供了很好的模式,但是你也可以通過有針對性的設(shè)計來解決。

比如,對于層層回調(diào)的模式,可以利用消息機制來改寫,假定你的系統(tǒng)中已經(jīng)實現(xiàn)了消息機制,你的code可以寫成這樣:

  1. eventbus.on("init"function(){  
  2.     operationA(function(err,result){  
  3.         eventbus.dispatch("ACompleted");  
  4.     });  
  5. });  
  6.  
  7. eventbus.on("ACompleted"function(){  
  8.     operationB(function(err,result){  
  9.         eventbus.dispatch("BCompleted");  
  10.     });  
  11. });  
  12.  
  13. eventbus.on("BCompleted"function(){  
  14.     operationC(function(err,result){  
  15.         eventbus.dispatch("CCompleted");  
  16.     });  
  17. });  
  18.  
  19. eventbus.on("CCompleted"function(){  
  20.     // do something when all operation completed  
  21. });  

這樣我們就把嵌套的異步調(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、Koa

koa是由Express原班人馬(主要是TJ)打造,希望提供一個更精簡健壯的nodejs框架。koa依賴ES6中的Generator等新特性,所以必須運行在相應(yīng)的Nodejs版本上。
 

利用Generator、coThunk,可以在Koa中有效的解決Javascript異步調(diào)用的各種問題。

co是一個異步流程簡化的工具,它利用Generator把一層層嵌套的調(diào)用變成同步的寫法。

  1. var co = require('co');  
  2. var fs = require('fs');  
  3.  
  4. var stat = function(path) {  
  5.   return function(cb){  
  6.     fs.stat(path,cb);  
  7.   }  
  8. };  
  9.  
  10. var readFile = function(filename) {  
  11.   return function(cb){  
  12.     fs.readFile(filename,cb);  
  13.   }  
  14. };  
  15.  
  16. co(function *() {  
  17.   var stat = yield stat('./README.md');  
  18.   var content = yield readFile('./README.md');  
  19. })();  

通過co可以把異步的fs.readFile當(dāng)成同步一樣調(diào)用,只需要把異步函數(shù)fs.readFile用閉包的方式封裝。

利用Thunk可以進一步簡化為如下的code, 這里Thunk的作用就是用閉包封裝異步函數(shù),返回一個生成函數(shù)的函數(shù),供生成器來調(diào)用。

  1. var thunkify = require('thunkify');  
  2. var co = require('co');  
  3. var fs = require('fs');  
  4.  
  5. var stat = thunkify(fs.stat);  
  6. var readFile = thunkify(fs.readFile);  
  7.  
  8. co(function *() {  
  9.   var stat = yield stat('./README.md');  
  10.   var content = yield readFile('./README.md');  
  11. })();  

利用co可以串行或者并行的執(zhí)行異步調(diào)用。

串行

  1. co(function *() {  
  2.   var a = yield request(a);  
  3.   var b = yield request(b);  
  4. })();  

并行

  1. co(function *() {  
  2.  var res = yield [request(a), request(b)];  
  3. })();  

更多詳細的內(nèi)容,大家可以參考這兩篇文章1,2

總結(jié)

異步編程帶來的問題在客戶端Javascript中并不明顯,但隨著服務(wù)器端Javascript越來越廣的被使用,大量的異步IO操作使得該問題變得明顯。許多不同的方法都可以解決這個問題,本文討論了一些方法,但并不深入。大家需要根據(jù)自己的情況選擇一個適于自己的方法。
 

同時,隨著ES6的定義,Javascript的語法變得越來越豐富,更多的功能帶來了很多便利,然而原本簡潔,單一目的的Javascript變得復(fù)雜,也要承擔(dān)更多的任務(wù)。Javascript何去何從,讓我們拭目以待。

原文鏈接:http://my.oschina.net/taogang/blog/267707

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲丁香婷婷久久一区| 欧美一区二区三区99| 亚洲一区二区三区四区性色av| 99久久免费中文字幕| 欧美野外在线刺激在线观看| 四季av一区二区播放| 美国黑人一级黄色大片| 日本欧美在线一区二区三区| 欧美日韩国产精品第五页| 久久婷婷综合色拍亚洲| 99国产精品国产精品九九| 亚洲精品熟女国产多毛| 亚洲一区二区精品福利| 国产又粗又猛又爽又黄| 偷拍洗澡一区二区三区| 中文字幕亚洲在线一区| 尹人大香蕉一级片免费看| 99热在线播放免费观看| 国产a天堂一区二区专区| 麻豆精品视频一二三区| 99热九九热这里只有精品| 国产精品乱子伦一区二区三区| 大香蕉精品视频一区二区| 色涩一区二区三区四区| 人妻久久一区二区三区精品99| 国产av一二三区在线观看| 日韩高清毛片免费观看| 国产欧美日韩在线精品一二区| 日韩高清毛片免费观看| 国产免费操美女逼视频| 日韩精品亚洲精品国产精品| 精品综合欧美一区二区三区| 在线免费不卡亚洲国产| 精品日韩中文字幕视频在线| 亚洲欧美日韩精品永久| 激情视频在线视频在线视频 | 色哟哟在线免费一区二区三区| 午夜精品福利视频观看| 91在线国内在线中文字幕| 欧美午夜一级特黄大片| 欧美激情一区二区亚洲专区|