Node.js的回撥函式以及事件迴圈
阿新 • • 發佈:2019-02-04
Node.js回撥函式
Node.js是單程序單執行緒應用程式,但是可以通過事件和回撥支援併發操作
Node.js的非同步程式設計依託於回撥實現。Node.js中有大量的回撥函式函式,Node的所有API都支援回撥函式。
非同步程式設計就是併發性的執行程式。使得可以同時執行多項工作減少了裝置的阻塞和等待。可以處理大量的併發請求。
阻塞例項:
var fs = require("fs");
var data = fs.readFileSync('input.txt');
console.log(data.toString());
非阻塞程式碼例項
var fs = require ("fs");
fs.readFile('input.txt',function(err.data){
if(err) return console.error(err);
console.log(data.toString());
});
阻塞是按順序執行,非阻塞是不需要按順序的,所以如果需要處理回撥函式的引數,我們需要寫在回撥函式內。
事件迴圈
Node.js基本上所有的事件機制都是用設計模式中觀察者模式實現
事件驅動程式
Node.js 使用事件驅動模型,當web server接收到請求,就把它關閉然後進行處理,然後去服務下一個web請求。
當這個請求完成,它被放回處理佇列,當到達佇列開頭,這個結果被返回給使用者。
這個模型非常高效可擴充套件性非常強,因為webserver一直接受請求而不等待任何讀寫操作。(這也被稱之為非阻塞式IO或者事件驅動IO)
在事件驅動模型中,會生成一個主迴圈來監聽事件,當檢測到事件時觸發回撥函式。
驅動的流程如圖,事件由web server接收,並放入到事件佇列中,又由Event Handlers 來呼叫相應的處理來處理事件。
例項:
//引入events模組,其實就是不斷的呼叫觸發事件,但是實現定義好關聯好事件與Observer
var events = require('events');//引入Events模組
var eventEmitter = new events.EventEmitter();//建立evetEmitter物件,每一個事件的迴圈都需要以上兩步
//建立事件處理程式
var connetHandler = function connected(){
console.log('連線成功' );
//觸發 data_received事件
eventEmitter.emit('data_received');
}
//繫結connection事件處理程式
eventEmitter.on('connection',connectionHanlder);
//使用匿名函式繫結data_received事件
eventEmitter.on('data——received',function(){
console.log('資料接收成功');
});
//觸發connection事件
eventEmitter.emit('connection');
console.log("程式執行完畢。");