node.js中基本上全部的事件機制都是採用觀察者模式實現。
node.js單線程相似進入一個while(true)的事件循環,直到沒有事件觀察者退出,每一個異步事件都生成一個事件觀察者,若是有事件發生就調用該回調函數。node
node.js事件驅動流程
node.js使用事件驅動模型,當web server接收到請求,就把它關閉而後轉給子線程處理業務,主線程去服務下一個web請求。
當子線程完成此次請求的業務,它會被放到一個隊列中,當它到了隊列的出口,就會觸發回調函數,將這個結果返回給用戶。
在這個事件驅動模型中,會生成一個主循環來監聽事件,當檢測到事件時觸發回調函數。
事件的驅動流程比較像 觀察者模式,事件至關於一個主題(Subject),全部註冊到這個事件上的處理函數至關於觀察者(Observer)。
以下是node.js的事件實例web
//載入 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('程序執行完畢');
執行結果異步
上述代碼執行流程
1>eventEmitter.emit('connection'),觸發id = 'connection'對應的事件
2>'connection'綁定的事件是connectHandler
3>connectHandler是方法function connected()返回的結果,因此進去該方法
4>打印出'鏈接成功'
5>觸發id='data_received'對應的事件
6>'data_received'對應的是方法function()
7>該方法執行 打印出'數據接收成功'
8>事件部分處理完畢,執行最後'程序處理完畢'函數