简介
EventEmitter 来自events模块,这个模块是各种事件的模块,向之前学的模块中.on(‘事件名’, 回调函数) 这个都是来自EventEmitter 模块, 而且这个是注册事件而触发事件是.emit(‘事件名’) 这个emit像极vue里那个emit
示例
const { EventEmitter } = require("events");
// 创建一个事件处理对象
// 可以注册事件,可以触发事件
const ee = new EventEmitter();
ee.on("abc", () => {
console.log("abc事件触发了1");
});
const fn2 = () => {
console.log("abc事件触发了2");
}
ee.on("abc", fn2);
/**
*只触发一次
*/
ee.once("abc", () => {
console.log("abc事件触发了3", "该事件只触发一次");
});
ee.on("bcd", () => {
console.log("bcd事件触发了3");
});
ee.emit("abc"); //触发名为abc的事件,会依次运行注册的事件函数
ee.off("abc", fn2) // 取消事件
ee.emit("abc"); //触发名为abc的事件,会依次运行注册的事件函数
ee.emit("abc"); //触发名为abc的事件,会依次运行注册的事件函数
ee.emit("bcd"); //触发名为bcd的事件,会依次运行注册的事件函数
console.log("script end")
传递参数与vue中的emit一样
const { EventEmitter } = require("events");
// 创建一个事件处理对象
// 可以注册事件,可以触发事件
const ee = new EventEmitter();
ee.on("abc", (data1, data2) => {
console.log("abc事件触发了", data1, data2);
});
ee.emit("abc", 123, 456)
通过事件来让请求更简单
// 发送网络请求模块
const http = require("http");
const { EventEmitter } = require("events");
module.exports = class extends EventEmitter {
constructor(url, options) {
super();
this.url = url;
this.options = options;
}
send(body = "") {
const request = http.request(this.url, this.options, res => {
let result = "";
res.on("data", chunk => {
result += chunk.toString("utf-8");
});
res.on("end", () => {
this.emit("res", res.headers, result);
});
});
request.write(body);
request.end();
}
};
发送请求
const MyRequest = require("./MyRequest");
const request = new MyRequest("http://duyi.ke.qq.com");
request.send();
request.on("res", (headers, body) => {
console.log(headers);
console.log(body);
});