NodeJs簡明教程(7)

NodeJs簡明教程將從零開始學習NodeJs相關知識,助力JS開發者構建全棧開發技術棧!微信

本文是NodeJs簡明教程的第七篇,將介紹NodeJs events模塊相關的基本操做。架構

大多數 Node.js 核心 API 構建於慣用的異步事件驅動架構,其中某些類型的對象(又稱觸發器,Emitter)會觸發命名事件來調用函數(又稱監聽器,Listener)。異步

快速開始

使用事件監聽器通常包含如下操做:函數

  1. 新建事件監聽器實例
  2. 設置監聽函數
  3. 觸發事件
const EventEmitter = require('events'); // 引用模塊

class MyEmitter extends EventEmitter {} // 初始化監聽器

const myEmitter = new MyEmitter();

myEmitter.on('event', () => { // 設置監聽函數
  console.log('an event occurred!');
});

myEmitter.emit('event'); // 觸發事件
複製代碼

以上例程會輸出an event occurred!學習

一次性事件監聽

上文中的監聽方式事件觸發幾回就會輸出幾回an event occurred!,有些事件多是一次性的。這時候能夠使用once監聽。ui

const EventEmitter = require('events'); // 引用模塊

class MyEmitter extends EventEmitter {} // 初始化監聽器

const myEmitter = new MyEmitter();

myEmitter.once('event', () => { // 設置監聽函數
  console.log('an event occurred!');
});

myEmitter.emit('event'); // 觸發事件
myEmitter.emit('event'); // 觸發事件
複製代碼

以上例程會輸出1次 an event occurred!;spa

同一事件屢次監聽

上文中的監聽方式都是隻有1個監聽函數,經過屢次調用on能夠設置多個監聽函數。code

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.once('event', () => { // 監聽器1
  console.log('監聽器1收到事件');
});

myEmitter.on('event', () => { // 監聽器2
  console.log('監聽器2收到事件');
})

myEmitter.emit('event'); // 觸發事件
複製代碼

以上例程會輸出cdn

監聽器1收到事件
監聽器2收到事件
複製代碼

接收事件參數

  1. emit函數的第一個值爲事件名,後續參數爲事件值
  2. ononce等監聽器設置函數的回調函數收到的值爲emit傳入的事件參數
const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.once('event', (param1,param2,param3) => { // 接收事件參數
  console.log('收到事件',param1,param2,param3);
});

myEmitter.emit('event','參數1','參數2',{name:'參數3'}); // 發送事件參數
複製代碼

以上例程會輸出對象

收到事件 參數1 參數2 { name: '參數3' }
複製代碼

獲取事件監聽器上全部事件

使用eventNames()實例方法獲取監聽器上全部事件

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.once('event', (param1,param2,param3) => {
  console.log('收到事件',param1,param2,param3);
});

myEmitter.once('event2',() => {
  console.log('收到事件2');
});

console.log(myEmitter.eventNames());
複製代碼

以上例程輸出[ 'event', 'event2' ]

移除事件監聽器

使用off實例方法移除單個監聽器

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

const callback = (param1) => {
  console.log(param1);
};

myEmitter.on('event', callback); // 添加監聽器

myEmitter.off('event', callback); // 移除監聽器

myEmitter.emit('event'); // 觸發事件
複製代碼

以上例程沒有輸出,由於先添加監聽器,隨後移除,觸發事件時已經沒有可用的監聽器了

移除全部監聽器

使用removeAllListeners([eventName])實例方法移除全部監聽器

  1. removeAllListener不傳參數時移除該emitter實例全部事件監聽器
  2. removeAllListener傳入字符串參數時移除該emitter實例全部該事件的監聽器

結語

事件系統是NodeJs的靈魂,在幾乎全部的I/O模塊都有使用,但願各位讀者好好掌握。事件模塊讀後有疑問請加微信羣討論。

微信羣
相關文章
相關標籤/搜索