zoukankan      html  css  js  c++  java
  • 591 内置模块events

    3.1. 基本使用

    Node中的核心API都是基于异步事件驱动的:

    • 在这个体系中,某些对象(发射器(Emitters))发出某一个事件;
    • 我们可以监听这个事件(监听器 Listeners),并且传入的回调函数,这个回调函数会在监听到事件时调用;

    发出事件和监听事件都是通过EventEmitter类来完成的,它们都属于events对象。

    • emitter.on(eventName, listener):监听事件,也可以使用addListener
    • emitter.off(eventName, listener):移除事件监听,也可以使用removeListener
    • emitter.emit(eventName[, ...args]):发出事件,可以携带一些参数;
    const EventEmmiter = require('events');
    
    // 监听事件
    const bus = new EventEmmiter();
    
    function clickHanlde(args) {
      console.log("监听到click事件", args);
    }
    
    bus.on("click", clickHanlde);
    
    setTimeout(() => {
      bus.emit("click", "hahaha");
      bus.off("click", clickHanlde);
      bus.emit("click", "kobe");
    }, 2000);
    

    01_events基础方法.js

    const EventEmitter = require("events");
    
    // 1.创建发射器
    const emitter = new EventEmitter();
    
    // 2.监听某一个事件
    // addListener是on的alias简写
    emitter.on('click', (args) => {
      console.log("监听1到click事件", args);
    })
    
    const listener2 = (args) => {
      console.log("监听2到click事件", args);
    }
    
    emitter.on('click', listener2)
    
    // 3.发出一个事件
    setTimeout(() => {
      emitter.emit("click", "hahaha", "james", "kobe");
      emitter.off("click", listener2);
      emitter.emit("click", "hahaha", "james", "kobe");
    }, 2000);
    

    3.2. 常见的属性

    EventEmitter的实例有一些属性,可以记录一些信息:

    • emitter.eventNames():返回当前 EventEmitter对象注册的事件字符串数组;
    • emitter.getMaxListeners():返回当前 EventEmitter对象的最大监听器数量,可以通过setMaxListeners()来修改,默认是10;
    • emitter.listenerCount(事件名称):返回当前 EventEmitter对象某一个事件名称,监听器的个数;
    • emitter.listeners(事件名称):返回当前 EventEmitter对象某个事件监听器上所有的监听器数组;
    console.log(bus.eventNames());
    console.log(bus.getMaxListeners());
    console.log(bus.listenerCount("click"));
    console.log(bus.listeners("click"));
    

    02_events获取信息.js

    const EventEmitter = require('events');
    
    // 1.创建发射器
    const emitter = new EventEmitter();
    
    // 2.监听某一个事件
    // addListener是on的alias简写
    emitter.on('click', (args) => {
      console.log("监听1到click事件", args);
    })
    
    const listener2 = (args) => {
      console.log("监听2到click事件", args);
    }
    emitter.on('click', listener2)
    
    emitter.on("tap", (args) => {
      console.log(args);
    })
    
    // 3.获取注册的事件
    console.log(emitter.eventNames());
    console.log(emitter.listenerCount("click"));
    console.log(emitter.listeners("click"));
    

    3.3. 方法的补充

    emitter.once(eventName, listener):事件监听一次

    const EventEmitter = require('events');
    
    const emitter = new EventEmitter();
    
    emitter.once('click', (args) => {
      console.log("监听到事件", args);
    })
    
    setTimeout(() => {
      emitter.emit('click', 'hahaha');
      emitter.emit('click', 'hahaha');
    }, 2000);
    

    emitter.prependListener():将监听事件添加到最前面

    emitter.on('click', (args) => {
      console.log("a监听到事件", args);
    })
    
    // b监听事件会被放到前面
    emitter.prependListener("click", (args) => {
      console.log("b监听到事件", args);
    })
    

    emitter.prependOnceListener():将监听事件添加到最前面,但是只监听一次

    emitter.prependOnceListener("click", (args) => {
      console.log("c监听到事件", args);
    })
    

    emitter.removeAllListeners([eventName]):移除所有的监听器

    // 移除emitter上的所有事件监听
    emitter.removeAllListeners();
    // 移除emitter上的click事件监听
    emitter.removeAllListeners("click");
    

    03_events不常用方法.js

    const EventEmitter = require("events");
    
    // 1.创建发射器
    const emitter = new EventEmitter();
    
    // 2.监听某一个事件
    // addListener是on的alias简写
    // 只执行一次
    emitter.once('click', (arg1, arg2, arg3) => {
      console.log("监听1到click事件", arg1, arg2, arg3);
    })
    
    const listener2 = function(arg1, arg2, arg3) {
      // 特点: 绑定this, 也不绑定arguments数组
      console.log(arguments);
      console.log(this);
      console.log("监听2到click事件", arg1, arg2, arg3);
    }
    
    emitter.on('click', listener2)
    
    // 将本次监听放到最前面
    emitter.prependListener('click', (arg1, arg2, arg3) => {
      console.log("监听3到click事件", arg1, arg2, arg3);
    })
    
    emitter.on("scroll", (args) => {
      console.log("监听到scroll方法");
    })
    
    
    // 3.发出一个事件
    setTimeout(() => {
      // emitter.removeAllListeners("click");
      emitter.emit("click", "hahaha", "james", "kobe");
      emitter.emit("click", "hahaha", "james", "kobe");
      emitter.emit("scroll", "hahaha", "james", "kobe");
    }, 2000);
    
    console.log(arguments);
    console.log(this);
    
  • 相关阅读:
    BZOJ 3205 [Apio2013]机器人 ——斯坦纳树
    BZOJ 3782 上学路线 ——动态规划 Lucas定理 中国剩余定理
    HDU 1423 Greatest Common Increasing Subsequence ——动态规划
    BZOJ 3309 DZY Loves Math ——莫比乌斯反演
    POJ 1038 Bugs Integrated, Inc. ——状压DP
    POJ 3693 Maximum repetition substring ——后缀数组
    POJ 2699 The Maximum Number of Strong Kings ——网络流
    POJ 2396 Budget ——有上下界的网络流
    BZOJ 4650 [Noi2016]优秀的拆分 ——后缀数组
    源码安装python
  • 原文地址:https://www.cnblogs.com/jianjie/p/14343091.html
Copyright © 2011-2022 走看看