Node.js事件迴圈


Node JS是單執行緒應用程式,但它通過事件和回撥概念,支援並行。 由於Node JS每一個API是非同步的,作為一個單獨的執行緒,它使用非同步函式呼叫,以保持並行性。Node JS使用觀察者模式。Node執行緒保持一個事件迴圈,每當任何任務得到完成,它觸發這標誌著該事件偵聽器函式執行相應的事件。

事件驅動程式設計

Node.js大量使用事件,這也是為何Node.js是相當快相對於其他類似的技術。當Node啟動其伺服器,它可以簡單地啟動它的變數,宣告的函式,然後簡單地等待發生的事件。

在事件驅動的應用中,通常主迴圈監聽事件,然後觸發回撥函式時被檢測到這些事件之一。

Event Loop

儘管事件似乎類似於回撥。不同之處在於如下事實,當非同步函式返回其結果的回撥函式被呼叫的地方作為對觀察者模式的事件處理。 監聽事件的功能作為觀察員。每當一個事件被觸發,它的監聽函式就開始執行。Node.js具有多個內建通過事件模組和用於將事件係結和事件偵聽,如下EventEmitter類可用事件:

// Import events module
var events = require('events');
// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

以下為事件處理程式係結使用事件的語法:

// Bind event and even handler as follows
eventEmitter.on('eventName', eventHandler);

我們可以通過程式設計觸發一個事件,如下所示:

// Fire an event 
eventEmitter.emit('eventName');

例子

建立一個名為具有以下程式碼main.js一個js檔案:

// Import events module
var events = require('events');
// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

// Create an event handler as follows
var connectHandler = function connected() {
   console.log('connection succesful.');
  
   // Fire the data_received event 
   eventEmitter.emit('data_received');
}

// Bind the connection event with the handler
eventEmitter.on('connection', connectHandler);
 
// Bind the data_received event with the anonymous function
eventEmitter.on('data_received', function(){
   console.log('data received succesfully.');
});

// Fire the connection event 
eventEmitter.emit('connection');

console.log("Program Ended.");

現在讓我們試著執行上面的程式作為檢查的輸出:

$ mnode main.js

這將產生以下結果:

connection succesful.
data received succesfully.
Program Ended.

Node應用程式是如何工作的?

在Node應用程式,任何非同步函式接受回撥作為最後的引數和回撥函式接受錯誤的第一個引數。我們再看一下前面的例子了。建立一個名為input.txt的有以下內容的文字檔案

Yiibai Point is giving self learning content
to teach the world in simple and easy way!!!!!

建立一個名為具有以下程式碼的main.js一個js檔案:

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
   if (err){
      console.log(err.stack);
      return;
   }
   console.log(data.toString());
});
console.log("Program Ended");

這裡fs.readFile()是一個非同步函式,其目的是要讀取檔案。如果在檔案的讀出發生了錯誤,則er物件將包含相應的錯誤,否則資料將包含該檔案的內容。readFile傳遞err和資料,回撥函式後,檔案讀取操作完成,並最終列印的內容。

Program Ended
Yiibai Point is giving self learning content
to teach the world in simple and easy way!!!!!