天天看點

nodejs-REPL/回調函數/事件循環

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'
	}
}