為了更好的處理嵌套回調的問題,可以考慮使用壹些專門做異步處理的第三方庫,當然也可以自己編寫壹個異步處理的輔助工具。
處理async、q和promise的常用庫有。根據npmjs.org的網站,async是最火的。之前用過Async,確實方便,各種異步處理的控制流程也很好的實現了。
我們將使用async來處理同時讀取兩個文件的初始代碼。示例如下:
var async = require(“async”)
,fs = require(' fs ');
異步並行([
函數(回調){
fs.readFile('/etc/passwd ',function (err,data) {
if (err)回調(err);
回調(空,數據);
});
},
函數(回調){
fs.readFile('/etc/passwd2 ',function (err,data2) {
if (err)回調(err);
回調(null,data 2);
});
}
],
函數(錯誤,結果){
//這裏處理data和data2數據,從結果中獲取每個文件的內容。
});
通過async模塊,可以很好的控制異步執行流程,解決了層層回調的問題。代碼比以前清晰了,但還是離不開回調函數。
想想不使用回調函數來處理異步該有多好。接下來,我們來談談如何利用ES6的新特性來實現這個目標。
優雅點:擁抱ES6,替代回調函數,解決回調地獄問題。
換句話說,EcmaScript Harmony (ES6)為js引入了許多新特性。對ES6不太了解的同學可以自己百度壹下。
要在nodejs中使用ES6的新特性,需要使用v0.11.x以上的版本..
本文介紹了使用生成器功能代替回調函數,但是妳不了解生成器?妳可以看看這裏。
這裏使用了co和thunkify兩個模塊,大家都用npm install命令來安裝。
在啟動時,為了讓nodejs支持ES6的特性,需要附加壹個-harmony參數,比如:node - harmony index.js
仍然以本文開頭提到的問題為例,使用生成器特性的示例代碼如下:
var fs = require('fs ')
,co =要求(' co ')
,thunkify = require(' thunkify ');
var readFile = thunkify(fs . readFile);
文書主任(職能*){
var test 1 = yield readFile(' test 1 . txt ');
var test 2 = yield readFile(' test 2 . txt ');
var test = test 1 . tostring()+test 2 . tostring();
console.log(測試);
})();
在代碼中處理異常也很簡單,就OK了:
嘗試{
var test 1 = yield readFile(' test 1 . txt ');
} catch (e) {
//在此處理異常
}
這段代碼不是優雅多了嗎?像寫同步代碼壹樣處理異步是不是很酷?
在nodejs領域,Web開發最火的框架是express。值得壹提的是,express的核心成員TJ領導了壹個新的Web框架——KOA,號稱是下壹代Web開發框架。KOA真正利用了ES6的生成器,避免了開發Web系統時陷入層層回調。