2012年4月28日 星期六

Basic of Node.js - Non-Block

Node.js以JavaScript為語法結構,同樣繼承JavaScript的Non-Block特性,下面範例說明在Non-Block的程序中,同樣print一筆資料,順序性並非程式碼中行號的順序,而是每個程序執行的回應時間

Ex1:

setTimeout(function(){
  console.log("foo...");
}, 1000);
console.log("bar...");

結果:
$ node 000-nonblock.js
bar...
foo...

由上面結果可以看到foo程序雖然在bar程序之前,但是因為foo需要等待1000毫秒,所以會再bar程序之後印出
為了讓執行時間瞬間被列出,修改上面程式如下:

Ex2: (000-nonblock3.js)
function ffoo(){
  log('Start foo...');
  setTimeout(function(){
    log("foo...");
  }, 1000);
  log('End foo...');
}
function fbar(){
  log('Start bar...');
  log('bar...');
  log('End bar...');
}
function log(msg) {
  console.log("["+new Date()+"]"+msg);
}  
//真正執行區塊
ffoo(); //
fbar();
結果:
$ node 000-nonblock3.js
[Sun Apr 29 2012 00:44:53 GMT+0800 (CST)]Start foo...
[Sun Apr 29 2012 00:44:53 GMT+0800 (CST)]End foo...
[Sun Apr 29 2012 00:44:53 GMT+0800 (CST)]Start bar...
[Sun Apr 29 2012 00:44:53 GMT+0800 (CST)]bar...
[Sun Apr 29 2012 00:44:53 GMT+0800 (CST)]End bar...
[Sun Apr 29 2012 00:44:54 GMT+0800 (CST)]foo...
SimonAIR:Sample simonsu$ vi 000-nonblock3.js 

由上面時間可以很清楚看出ffoo()中的"Start foo..."訊息在程式一開始即已列出,接著馬上執行"End foo...",然後"Start bar..."
這意味著setTimeout function中要列印出的"foo..."被Non-Block丟出一個執行序去執行了
而該執行蓄因為要等待1000毫秒才回應,所以程序先跑下面的部分

另外關於"Start bar...", "bar...", "End bar..."部分照順序被列出來,則是非Non-Block程式碼的順序性所致

在Node.js / JavaScript的世界裡,Block與Non-Block的交互使用有不少好處,卻也會惹出不少麻煩,慎用阿!