REPL 回調函數 事件循環
REPL-----------------------------------------------------
Node.js REPL(Read Eval Print Loop:互動式解釋器) 表示一個電腦的環境,類似 Window 系統的終端或 Unix/Linux shell,我們可以在終端中輸入指令,并接收系統的響應。
REPL可以執行如下任務{
讀取 - 讀取使用者輸入,解析輸入了Javascript 資料結構并存儲在記憶體中。
執行 - 執行輸入的資料結構
列印 - 輸出結果
循環 - 循環操作以上步驟直到使用者兩次按下 ctrl-c 按鈕退出。
}
簡單的表達式運算 > 1 + ( 2 * 3 ) - 4
使用變量 > var y = 10
多行表達式{
> var x = 0
undefined
> do {
... x++;
... console.log("x: " + x);
... } while ( x < 5 );
}
下劃線(_)變量
你可以使用下劃線(_)擷取上一個表達式的運算結果:{
$ node
> var x = 10
undefined
> var y = 20
undefined
> x + y
30
> var sum = _
undefined
> console.log(sum)
30
undefined
>
}
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 所有 API 都支援回調函數。
回調函數一般作為函數的最後一個參數出現
function foo1(name, age, callback) { }
function foo2(value, callback1, callback2) { }
----阻塞代碼執行個體
建立檔案input.txt内容是{
inputmessage
}
然後建立main.js 内容是{
var fs = require("fs");
var data = fs.readFileSync('input.txt'); //synchronization 同步
console.log(data.toString());
console.log("程式執行結束!");
}
輸出{
inputmessage
程式執行結束!
}
----非阻塞代碼執行個體
建立檔案input.txt内容和上面一樣。
然後main.js代碼改成這樣{
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("程式執行結束!");
}
輸出{
程式執行結束
inputmessage
}
事件循環-----------------------------------------------------
Node.js 是單程序單線程應用程式,但是因為 V8 引擎提供的異步執行回調接口,通過這些接口可以處理大量的并發,是以性能非常高。
Node.js 幾乎每一個 API 都是支援回調函數的。
Node.js 基本上所有的事件機制都是用設計模式中觀察者模式實作。
Node.js 單線程類似進入一個while(true)的事件循環,直到沒有事件觀察者退出,每個異步事件都生成一個事件觀察者,如果有事件發生就調用該回調函數.
Node.js 有多個内置的事件,我們可以通過引入 events 子產品,并通過執行個體化 EventEmitter 類來綁定和監聽事件,如下執行個體:
// 引入 events 子產品
var events = require('events');
// 建立 eventEmitter 對象
var eventEmitter = new events.EventEmitter();
// 建立事件處理程式
var connectHandler = function connected() {
console.log('連接配接成功。');
// 觸發 data_received 事件
eventEmitter.emit('data_received');
}
// 綁定 connection 事件處理程式
eventEmitter.on('connection', connectHandler);
// 使用匿名函數綁定 data_received 事件
eventEmitter.on('data_received', function(){
console.log('資料接收成功。');
});
// 觸發 connection 事件
eventEmitter.emit('connection');
console.log("程式執行完畢。");
執行結果{
連接配接成功。
資料接收成功。
程式執行完畢。
}
Node 應用程式是如何工作的?{
在 Node 應用程式中,執行異步操作的函數将回調函數作為最後一個參數, 回調函數接收錯誤對象作為第一個參數。
input.txt{
inputmessage
}
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err){
console.log(err.stack);
return;
}
console.log(data.toString());
});
console.log("程式執行完畢");
執行結果{
程式執行完畢
inputmessage
}
删除input.txt讓他報錯,執行結果是這樣的{
程式執行完畢
Error: ENOENT: no such file or directory, open 'C:\Users\Administrator\Desktop\S\input.txt'
}
}