延續昨天的 module 課題。其實 Module 除了可以自訂之外(像我們昨天的 stuff ),node.JS 中還有許多方便內建的模組,稱作core module,要 import 這些 Module 我們直接 require(“core Module name”) 就好,使用上十分方便,下面就簡單介紹幾個 core Module 吧!
#Event
Event
,中文叫事件,沒錯,就是 JavaScript 語法 addEventListener 的 Event。這個 Event Module 可以讓我們自訂事件,然後當那個事件被觸發時透過 function 去做一些事,就像那些我們在 JS 的 addEventListener
做的。
第一步:import event module
const events = require('events')
第二步:建立一個 Event Emitter 實例:
const myEmitter = new events.Eventemitter()
第三步:自訂 event 和觸發時要做的事 :
myEmitter.on('myEvent', msg => console.log(msg))
第四步:觸發事件
myEmitter.emit('myEvent', 'hello 你好嗎? 事件觸發中')
這樣就能簡單自訂和觸發事件惹
util
util 也是一個 node 內建的 core module,這個 util module 有許多不同的功能,我們今天要使用的是 inherits,他能使某個函式實現原型繼承。
一樣我們先 import 這個 module
const util = require('util')
然後我們寫一個 function constructor:
如果對函式建構式不熟的可以看PJ大的這篇
let Person = function(name){
this.name = name
}
然後我們現在想讓 Person 繼承 Event Emitter:
util.inherits (Person, event.EventEmitter)
//util.inherits(constructor( 建構子,繼承別人的人 ), superConstructor( 父建構子,被繼承的人))
之後用這個 function constructor 做出三個人,並將這三個人放進陣列裡用forEach跑迴圈替每個人榜上'speak'這自訂 event:
let james = new Person('james')
let mary = new Person('mary')
let ryu = new Person('ryu')
let people = [james, mary, ryu]
people.forEach(person =>{
person.on('speak', msg =>
console.log(`${person.name} said ${msg})
)}
)
最後用 emit 觸發他們:
james.emit('speak', 'hey dude')
ryu.emit('speak', 'I like curry')
今天就先到這邊
我們明天見
ㄅㄅ
後記: util.inherits 這個語法已進入墳墓惹,我們點開 node.js 的 doc,他會推薦你使用es6 的 extend 和class 取代 util.inherits,下面是新的寫法
const EventEmitter = require('events');
class MyStream extends EventEmitter {
write(data) {
this.emit('data', data);
}
}
const stream = new MyStream();
stream.on('data', (data) => {
console.log(`Received data: "${data}"`);
});
stream.write('With ES6');
這邊有 extend
、 class
的介紹