1. 程式人生 > >Node.js的回撥函式以及事件迴圈

Node.js的回撥函式以及事件迴圈

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("程式執行完畢。");