简介

EventEmitter 来自events模块,这个模块是各种事件的模块,向之前学的模块中.on(‘事件名’, 回调函数) 这个都是来自EventEmitter 模块, 而且这个是注册事件而触发事件是.emit(‘事件名’) 这个emit像极vue里那个emit

示例

  1. const { EventEmitter } = require("events");
  2. // 创建一个事件处理对象
  3. // 可以注册事件,可以触发事件
  4. const ee = new EventEmitter();
  5. ee.on("abc", () => {
  6. console.log("abc事件触发了1");
  7. });
  8. const fn2 = () => {
  9. console.log("abc事件触发了2");
  10. }
  11. ee.on("abc", fn2);
  12. /**
  13. *只触发一次
  14. */
  15. ee.once("abc", () => {
  16. console.log("abc事件触发了3", "该事件只触发一次");
  17. });
  18. ee.on("bcd", () => {
  19. console.log("bcd事件触发了3");
  20. });
  21. ee.emit("abc"); //触发名为abc的事件,会依次运行注册的事件函数
  22. ee.off("abc", fn2) // 取消事件
  23. ee.emit("abc"); //触发名为abc的事件,会依次运行注册的事件函数
  24. ee.emit("abc"); //触发名为abc的事件,会依次运行注册的事件函数
  25. ee.emit("bcd"); //触发名为bcd的事件,会依次运行注册的事件函数
  26. console.log("script end")

传递参数与vue中的emit一样

  1. const { EventEmitter } = require("events");
  2. // 创建一个事件处理对象
  3. // 可以注册事件,可以触发事件
  4. const ee = new EventEmitter();
  5. ee.on("abc", (data1, data2) => {
  6. console.log("abc事件触发了", data1, data2);
  7. });
  8. ee.emit("abc", 123, 456)

通过事件来让请求更简单

  1. // 发送网络请求模块
  2. const http = require("http");
  3. const { EventEmitter } = require("events");
  4. module.exports = class extends EventEmitter {
  5. constructor(url, options) {
  6. super();
  7. this.url = url;
  8. this.options = options;
  9. }
  10. send(body = "") {
  11. const request = http.request(this.url, this.options, res => {
  12. let result = "";
  13. res.on("data", chunk => {
  14. result += chunk.toString("utf-8");
  15. });
  16. res.on("end", () => {
  17. this.emit("res", res.headers, result);
  18. });
  19. });
  20. request.write(body);
  21. request.end();
  22. }
  23. };

发送请求

  1. const MyRequest = require("./MyRequest");
  2. const request = new MyRequest("http://duyi.ke.qq.com");
  3. request.send();
  4. request.on("res", (headers, body) => {
  5. console.log(headers);
  6. console.log(body);
  7. });