2012年12月23日 星期日

解決Node.js非同步問題... node-promise模組的使用


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操作的問題...
還是個值得多多了解的套件!