Node.js事件循環web
Node.js 是單進程單線程應用程序,可是由於V8引擎提供的異步執行回調接口,經過這些接口能夠處理大量的併發,因此性能很是高。
Node.js 幾乎每個API都支持回調函數。
Node.js 基本上全部都事件機制都是經過觀察者模式實現
Node.js 單線程相似進入一個while(true)事件循環,直到沒有事件觀察者退出,每一個異步事件都生成一個事件觀察者,
若是有事件發生就調用該回調函數。併發
事件驅動程序
Node.js 使用事件驅動模型,當web server接收到請求,就把它關閉而後進行處理,而後去服務下一個web請求。異步
當這個請求完成,它被放回處理隊列,當到達隊列開頭,這個結果被返回給用戶。函數
這個模型很是高效可擴展性很是強,由於webserver一直接受請求而不等待任何讀寫操做。(這也被稱之爲非阻塞式IO或者事件驅動IO)性能
在事件驅動模型中,會生成一個主循環來監聽事件,當檢測到事件時觸發回調函數。ui
//引入events const events = require('events') // 建立eventEmitter對象 const 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',() => { console.log('數據接收成功。') }) // 觸發connection事件 eventEmitter.emit('connection') console.log('程序執行完畢')
Node應用程序是如何工做的 ??spa
在Node應用程序中,執行異步操做都函數將回調函數做爲最後一個參數,回調函數接收錯誤對象作一個第一個參數。線程
const fs = require("fs") fs.readFile('input.txt',(err,data) => { if(err) { console.log(err) }else{ console.log(data.toString()) } }) console.log("程序執行結束!")
這段代碼,input.txt文件我給刪除了,因此在執行過程當中,發生錯誤,錯誤err對象就會輸出錯誤信息。code