單進(jìn)程+單線程
Node是單進(jìn)程單線程的程序翰舌,V8 引擎提供的異步執(zhí)行回調(diào)接口滩字,通過這些接口可以處理大量的并發(fā),所以性能非常高磅崭。
事件驅(qū)動
Node是以事件驅(qū)動的程序儿子,所謂事件驅(qū)動,指的是我們在前端使用http請求后砸喻,在后端的所設(shè)置的監(jiān)聽響應(yīng)
事件循環(huán)
當(dāng)并發(fā)很多的事件的時候柔逼,會產(chǎn)生這樣的事件循環(huán)模型
當(dāng)web server接收到請求->就把它關(guān)閉然后進(jìn)行處理,然后去服務(wù)下一個web請求蒋譬。
->當(dāng)這個請求完成->它被放回處理隊(duì)列->當(dāng)?shù)竭_(dá)隊(duì)列開頭->這個結(jié)果被返回給用戶。
main.js
// 引入 events 模塊
var events = require('events');
// 創(chuàng)建 eventEmitter 對象
var eventEmitter = new events.EventEmitter();
// 創(chuàng)建事件處理程序
var connectHandler = function connected() {
console.log('連接成功愉适。');
// 觸發(fā) data_received 事件
eventEmitter.emit('data_received');
}
// 綁定 connection 事件處理程序
eventEmitter.on('connection', connectHandler);
// 使用匿名函數(shù)綁定 data_received 事件
eventEmitter.on('data_received', function(){
console.log('數(shù)據(jù)接收成功犯助。');
});
// 觸發(fā) connection 事件
eventEmitter.emit('connection');
console.log("程序執(zhí)行完畢。");
執(zhí)行后维咸!
$ node main.js
連接成功剂买。
數(shù)據(jù)接收成功。
程序執(zhí)行完畢癌蓖。
繼承 EventEmitter
大多數(shù)時候我們不會直接使用 EventEmitter瞬哼,而是在對象中繼承它。包括 fs租副、net坐慰、 http 在內(nèi)的,只要是支持事件響應(yīng)的核心模塊都是 EventEmitter 的子類用僧。
為什么要這樣做呢结胀?原因有兩點(diǎn):
首先,具有某個實(shí)體功能的對象實(shí)現(xiàn)事件符合語義责循, 事件的監(jiān)聽和發(fā)生應(yīng)該是一個對象的方法糟港。
其次 JavaScript 的對象機(jī)制是基于原型的,支持 部分多重繼承院仿,繼承 EventEmitter 不會打亂對象原有的繼承關(guān)系秸抚。