Node.js的優點:Event Driven, Non-Block非常強悍,但是同時也造成許多寫作上的不便...
這邊主要想解決在非同步的模組中,想要循序執行的問題... node-promise是不錯的解決方案
安裝:
npm install node-promise
情境:
希望可以在抓取一個網頁完成之後,再執行某個動作...
語意上可以翻譯做:當抓取網頁Event完成後,才去驅動下一個Event
使用:
var p = new require("node-promise").Promise()
, request = require('request');
function step1(fn){ //包裝request的動作
request({
url : "http://www.google.com",
method : "GET"
},
function(e,r,d){
console.log('>>1');
p.resolve(d); // 註冊當動作完成時候的Listener
});
}
step1(); // 執行step1()
p.then( //當動作完成時候,即會執行then所定義的動作
function(result){ //定義收取結果後的操作
console.log('>>2');
console.log(result.substring(0,50));
},
function(err){ //定義收到錯誤時候的操作
console.log(err);
}
)
執行結果:
# node test-promise
>>1
>>2 // 2 會在 1 之後執行
<!doctype html><html itemscope="itemscope" itemtyp // 最後列出前request結果的50個字元
除了promise,該套件另外有提供defered與when的操作,可以讓流程更加豐富...
但是,說實在的...整個操作並沒有簡化到哪邊去... 甚至比較麻煩...
不過,透過promise的定義,對event附加Listener的方式倒是可以解決許多callback操作的問題...
還是個值得多多了解的套件!