前面我們已經配置好了Nodejs的環境。接下來我們可以使用node做一些事情。
我們可以在Nodejs REPL(交互式解釋器)中輸入命令。嘗試
讀取 - 讀取用戶輸入,解析輸入了Javascript數據結構並存儲在內存中。
執行 - 執行輸入的數據結構
打印 - 輸出結果
循環 - 循環操作以上步驟知道用戶兩次按下ctrl + c按鈕退出。
首先我們來介紹一下REPL有那些命令:
-
ctrl + c - 退出當前終端。
-
ctrl + c 按下兩次 - 退出 Node REPL。
-
ctrl + d - 退出 Node REPL.
-
向上/向下 鍵 - 查看輸入的歷史命令
-
tab 鍵 - 列出當前命令
-
.help - 列出使用命令
-
.break - 退出多行表達式
-
.clear - 退出多行表達式
-
.save filename - 保存當前的 Node REPL 會話到指定文件
-
.load filename - 載入當前 Node REPL 會話的文件內容。
接着我們就可以進入node,使用node命令進入node 命令輸入窗口,我們可以發現左側的 > ,我們就可以輸入運算 10 + 10 回車可以得到運行結果
我們也可以像在Javascript中定義變量。var x = 10 , 接着 console.log 輸出x變量的值 ,。
我們還可以輸入多行表達式,這點類似Javascript。。。。三個點是系統自動生成的。Node會自動檢測是否為連續表達式。
$ node > 10 + 10 undefined 20> var x = 10
undefined> console.log(x) 10 undefined
> do { ... x++; ... console.log("x: " + x); ... } while ( x < 5 ); x: 1 x: 2 x: 3 x: 4 x: 5 undefined
Nodejs 回調函數
Nodejs 異步變成的直接體現就是回調。異步編程依托於回調來實現。但不能說使用了回調函數程序就異步化了。
回調函數在完成任務后就會被調用。Node大量使用了回調函數。Node所有的API都支持回調函數。回調函數一般作為函數的最后一個參數出現。
//同步代碼實例
//創建一個文件 input.txt ,內容如下: This is input text file
//創建input.js與input.txt同級 var fs = require("fs"); var data = fs.readFileSync('input.txt'); console.log(data.toString()); console.log("Game Over!");
我們可以發現輸出結果的順序是:

那我們使用異步代碼會出現什么樣的結果勒?
var fs = require("fs");
var data = fs.readFile("input.txt",function(err,data){
if(err){
console.error(err);
}
console.log(data.toString());
});
console.log("Game Over!");
我們發現Game Over先輸出。應為readFile並不會阻塞程序。向下執行。當readyFile獲取到結果之后會調用回調函數輸出input.txt 內容

事件循環
由於Nodejs是單進程單線程引用程序。但應為V8引擎提供的回調函數。通過這些接口可以處理大量的並發,所以性能非常高。
單線程類似進入while(true) 的事件循環。知道沒有事件觀察者則退出。因為每一個時間都會生成一個時間觀察者。如果有時間發生就調用回調函數
Nodejs使用時間驅動模型,當web server 接收到請求,就會把它關閉然后進行處理。接着去服務下一個web請求,當這個請求完成。就會放回處理隊列中。當達到隊列開頭結果就會返回給用戶。
這個模型非常高效,擴展性非常強。應為web server不等待任何讀寫,也不等待操作完成。此模型被稱為非阻塞/驅動IO

Nodejs有多個內置時間。都是用過EventEmitter類來綁定和監聽時間。EventEmitter 存在於events模塊中。所以我們想要使用EventEmitter 對象我們需要引入event模塊
// 引入 events 模塊 var events = require('events'); // 創建 eventEmitter 對象 var eventEmitter = new events.EventEmitter();
接下來我們就可以把時間綁定到eventEmitter中。 並可以通過emit方法出發事件。
// 綁定事件及事件的處理程序 eventEmitter.on('eventName', function(){
//process function here.
}); // 觸發事件 eventEmitter.emit('eventName');
創建event.js如下:
var events = require("events"); var eventEmitter = new events.EventEmitter(); eventEmitter.on('connectionWebSocket',function(){ console.log('connection to websocket'); eventEmitter.emit('openWebSocket'); }); eventEmitter.on('openWebSocket',function(){ console.log('open websocket'); }); eventEmitter.emit('connectionWebSocket'); console.log('Connection Finished.');
我們通過node event.js可以看到如下結果。

