# EventEmitter

1\.

剛才在操作檔案時，看到類似這樣的東西

```
fs.on('open', function () {
  console.log('event has occured');
});
```

原因是當我們在讀取時他會自動發出

```
fs.emit('open');
```

而

```
fs.on("open")接到他的通知
```

實際上他已經繼承了EventEmitter

以下為一個範例

```
var EventEmitter = require('events').EventEmitter;
var oneEvent = new EventEmitter();

oneEvent.on('an Event', function () {
  console.log('event has occured');
});

function f() {
  console.log('start');
  oneEvent.emit('an Event');
  console.log('end');
}

f()
// start
// event has occured
// end
```

一個emit發出一個用on接收

Socket.io就是使用這個概念

2\. Node.js預設最多只能設定10個具有on的回調參數

```
var EventEmitter = require('events').EventEmitter;
var oneEvent = new EventEmitter();

oneEvent.on('an Event', function () {
  console.log('event has occured');
});
oneEvent.on('an Event', function () {
  console.log('event has occured');
});
oneEvent.on('an Event', function () {
  console.log('event has occured');
});
oneEvent.on('an Event', function () {
  console.log('event has occured');
});
oneEvent.on('an Event', function () {
  console.log('event has occured');
});
oneEvent.on('an Event', function () {
  console.log('event has occured');
});
oneEvent.on('an Event', function () {
  console.log('event has occured');
});
oneEvent.on('an Event', function () {
  console.log('event has occured');
});
oneEvent.on('an Event', function () {
  console.log('event has occured');
});
oneEvent.on('an Event', function () {
  console.log('event has occured');
});
oneEvent.on('an Event', function () {
  console.log('event has occured');
});
function f() {
  console.log('start');
  oneEvent.emit('an Event');
  console.log('end');
}

f()
// start
// event has occured
// end
```

代碼改成上面後會發現console出現提醒訊息

但

我們可以加入一行來手動增加監聽器on的數量

```
oneEvent.setMaxListeners(20);
```

2.可以在emit傳入參數

```
var EventEmitter = require('events').EventEmitter;
var myEmitter = new EventEmitter;

var connection = function(id,ad){
  console.log('client id: ' + id+ad);
};

myEmitter.on('connection', connection);
myEmitter.emit('connection', 6,8);
```

3\. 任何其他的函式都可以使用EventEmitter

只要將它繼承即可

```
var EventEmitter = require('events').EventEmitter;

function Dog(name) {
  this.name = name;
}

Dog.prototype.__proto__ = EventEmitter.prototype;
// 另一種寫法
// Dog.prototype = Object.create(EventEmitter.prototype);

var simon = new Dog('simon');

simon.on('bark', function(){
  console.log(this.name + ' barked');
});

setInterval(function(){
  simon.emit('bark');
}, 500);
```

或者

你也可以用util模組(內建)去做繼承

```
var util = require('util');
var EventEmitter = require('events').EventEmitter;

var Radio = function(station) {

    var self = this;
    console.log(this);
    setTimeout(function() {
       console.log(this);
    }, 0);

    setTimeout(function() {
       console.log(this);
    }, 5000);

    this.on('newListener', function(listener) {
        console.log('Event Listener: ' + listener);
    });

};

util.inherits(Radio, EventEmitter);

var station = {
  freq: '80.16',
  name: 'Rock N Roll Radio',
};

var radio = new Radio(station);

radio.on('open', function(station) {
  console.log('OPEN', station.name, station.freq);

});

radio.on('close', function(station) {
  console.log('CLOSE', station.name, station.freq);
});
```

4\. EventEmitter 原始的事件

newListener事件：添加新的回調函式時觸發。 removeListener事件：移除回調函式時觸發。

```
var EventEmitter = require('events').EventEmitter;
var Event = new EventEmitter;///////記得require後要產生實例

Event.on("newListener", function (evtName){
  console.log("New Listener: " + evtName);
});

Event.on("removeListener", function (evtName){
  console.log("Removed Listener: " + evtName);
});


function foo (){} ///放一個空的function

Event.on("this is on", foo);
Event.removeListener("this is on", foo);
```

5.once方法

```
和on使用方式相同，但他只會監聽一次即移除
```

6.一次移除所有監聽

```
var EventEmitter = require('events').EventEmitter;

var emitter = new EventEmitter;

emitter.removeAllListeners();
```

7.尋找某個事件擁有的回調函式

listener方法

```
var EventEmitter = require('events').EventEmitter;

var ee = new EventEmitter;

function onlyOnce () {

}

ee.on("firstConnection", onlyOnce)
ee.emit("firstConnection");

console.log(ee.listeners("firstConnection"));
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://easonwang.gitbook.io/web_advance/chapter1/eventemitter.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
