1. 程式人生 > >NodeJS基礎入門-Event

NodeJS基礎入門-Event

大多數Node.js核心API都採用慣用的非同步事件驅動架構,其中某些型別的物件(觸發器)會週期性地觸發命名事件來呼叫函式物件(監聽器)。
例如,net.Server物件會在每次有新連線時觸發事件;fs.ReadStream會在檔案被開啟時觸發事件;流物件會在資料可讀時觸發事件。
所有能觸發事件的物件都是EventEmitter類的例項。eventEmitterr.on()函式,允許將一個或多個函式繫結到會被物件觸發的命名事件上。事件名稱通常是駝峰式的字串,但也可以使用任何有效的JavaScript屬性名。
當EventEmitter物件觸發一個事件時,所有繫結在該事件上的函式都被同步地呼叫。監聽器的返回值會被丟棄。
例子,一個綁定了一個監聽器的EventEmitterr例項。eventEmitter.on()方法用於註冊監聽器,eventEmitter.emit()方法用於觸發事件。

const EventEmitter = require('events');

class CustomEvent extends EventEmitter { 

}

const ce = new CustomEvent();
ce.on('test', ()=>{
  console.log('This is a test!')
});

setInterval(() => {
  ce.emit('test')
},500);

不停的觸發這個事件:

This is a test!
This is a test!
This is a test!
This is a test!
This is a test!
This is a test!
This is a test!
This is a test!
^C

Error錯誤資訊列印

const EventEmitter = require('events');

class CustomEvent extends EventEmitter { 

}

const ce = new CustomEvent();
ce.on('error', err =>{
  console.log(err)
});

ce.emit('error',new Error('oops!'));

Error: oops!
at Object.

監聽並觸發結果,只調用一次

const EventEmitter = require('events');

class CustomEvent extends EventEmitter { 

}
// 只調用一次
const ce = new CustomEvent();
ce.once('test', () =>{
  console.log('test event');
});

setInterval(() => {
    ce.emit('test')
  }, 500);

test event

移除事件:


class CustomEvent extends EventEmitter {}

function fn1() {
  console.log('fn1');
}
function fn2() {
  console.log('fn2')
}

const ce = new CustomEvent();
ce.on('test', fn1);    //可以繫結多個方法
ce.on('test', fn2);

setInterval(() => {
  ce.emit('test');  
},500);

setTimeout(() => {
  //  ce.removeListener('test',fn2);  //移除fn2

  ce.removeAllListeners('test');    //移除所有事件
}, 2000);

fn1
fn2
fn1
fn2
fn1
fn2
^C