文章目錄
上一篇文章我們介紹了nodejs的模塊、module.exports 關鍵字暴露內容、require關鍵字請求內容以及他們的多種寫法,詳見: Node.js後端開發 - 基礎篇 #4 模塊 這篇文章我們將介紹nodejs的事件,nodejs本來就是基於事件驅動的,事件是nodejs的核心,所以我們要重點好好了解學習。
一、一個簡單的事件演示
我們可以在app.js裏面寫入以下代碼:
//這個require('events')你在當前目錄的模塊文件是找不到的,因爲這是nodejs的核心庫,
//所以它可以這樣直接使用,其中events它是事件的一個庫。
var events = require('events');
//新增一個事件對象
var myEmitter = new events.EventEmitter;
//然後我們要爲新增的事件,綁定一個監聽的函數on
//參數1:'someEvent' 爲事件的名稱
//參數2:事件發生後回調的函數
myEmitter.on('someEvent',function (message) {
console.log(message);
})
//那麼怎麼來觸發呢? 我們可以手動用代碼來觸發
//參數1:事件名稱。
//參數2:傳入參數內容,它對應函數的message參數
myEmitter.emit('someEvent', 'the event was emitted');
然後我們來看一看輸出結果:
bogon:hello-nodejs luminal$ node app
the event was emitted
bogon:hello-nodejs luminal$
二、比較真實一點的事件例子
基於上面的例子代碼,我們改改來看看一個比較真實一點的例子,代碼如下:
var events = require('events');
//這個庫是一個工具庫,裏面包含了很多工具,它也是nodejs的核心庫之一
//我們可參考api:https://nodejs.org/dist/latest-v9.x/docs/api/util.html
var util = require('util');
// 定義一個Person類,這是javaScript的寫法
var Person = function(name) {
this.name = name;
}
//然後我們調用工具庫裏面的函數inherits
//讓 Person類 繼承 events.EventEmitter 事件類
util.inherits(Person, events.EventEmitter);
//新建三個Person對象
var xiaoming = new Person('xiaoming');
var xiaohua = new Person('xiaohua');
var xiaobai = new Person('xiaobai');
// 把三個Person對象 放到 數組中
var person = [xiaoming,xiaohua,xiaobai];
// forEach 循環 person數組,
// 爲每個Person對象,依次綁定一個監聽的函數on
person.forEach(function(person) {
person.on('speak',function(message) {
console.log(person.name + "說:" + message);
})
});
//手動用代碼來觸發
xiaoming.emit('speak', '123');
xiaohua.emit('speak', '456');
xiaobai.emit('speak', '789');
然後我們來看一看輸出結果:
bogon:hello-nodejs luminal$ node app
xiaoming說:123
xiaohua說:456
xiaobai說:789
bogon:hello-nodejs luminal$
三、nodejs事件總結
因爲自己做過多年的java、android開發,通過上面的例子不難發現,nodejs事件無非就是三步曲,
1、新建 或 繼承 事件對象。 events.EventEmitter
2、綁定、回調。on
3、觸發。emit
nodejs事件的幾個api的鏈接,方便參考:
https://nodejs.org/dist/latest-v9.x/docs/api/events.html
https://nodejs.org/dist/latest-v9.x/docs/api/util.html