zoukankan      html  css  js  c++  java
  • NodeJS学习笔记 (21)事件机制-events(ok)

    模块概览

    events模块是node的核心模块之一,几乎所有常用的node模块都继承了events模块,比如http、fs等。

    模块本身非常简单,API虽然也不少,但常用的就那么几个,这里举几个简单例子。

    基础例子

    下面一共是6个例子,都非常简单,可以直接拷贝出来运行。例子5比较有意思,虽然也并不复杂,但确实是容易记错的点,感兴趣的同学可以看下。

    例子1:单个事件监听器

    var EventEmitter = require('events');
    
    class Man extends EventEmitter {}
    
    var man = new Man();
    
    man.on('wakeup', function(){
        console.log('man has woken up');
    });
    
    man.emit('wakeup');
    // 输出如下:
    // man has woken up


    例子2:同个事件,多个事件监听器

    可以看到,事件触发时,事件监听器按照注册的顺序执行。

    var EventEmitter = require('events');
    
    class Man extends EventEmitter {}
    
    var man = new Man();
    
    man.on('wakeup', function(){
        console.log('man has woken up');
    });
    
    man.on('wakeup', function(){
        console.log('man has woken up again');
    });
    
    man.emit('wakeup');
    
    // 输出如下:
    // man has woken up
    // man has woken up again

    例子3:只运行一次的事件监听器

    var EventEmitter = require('events');
    
    class Man extends EventEmitter {}
    
    var man = new Man();
    
    man.on('wakeup', function(){
        console.log('man has woken up');
    });
    
    man.once('wakeup', function(){
        console.log('man has woken up again');
    });
    
    man.emit('wakeup');
    man.emit('wakeup');
    
    // 输出如下:
    // man has woken up
    // man has woken up again
    // man has woken up

    例子4:注册事件监听器前,事件先触发

    可以看到,注册事件监听器前,事件先触发,则该事件会直接被忽略。

    var EventEmitter = require('events');
    
    class Man extends EventEmitter {}
    
    var man = new Man();
    
    man.emit('wakeup', 1);
    
    man.on('wakeup', function(index){
        console.log('man has woken up ->' + index);
    });
    
    man.emit('wakeup', 2);
    // 输出如下:
    // man has woken up ->2


    例子5:异步执行,还是顺序执行

    例子很简单,但非常重要。究竟是代码1先执行,还是代码2先执行,这点差异,无论对于我们理解别人的代码,还是自己编写node程序,都非常关键。

    实践证明,代码1先执行了。(node v6.1.0)

    var EventEmitter = require('events');
    
    class Man extends EventEmitter {}
    
    var man = new Man();
    
    man.on('wakeup', function(){
        console.log('man has woken up'); // 代码1
    });
    
    man.emit('wakeup');
    
    console.log('woman has woken up');  // 代码2
    
    // 输出如下:
    // man has woken up
    // woman has woken up


    例子6:移除事件监听器

    var EventEmitter = require('events');
    
    function wakeup(){
        console.log('man has woken up');
    }
    
    class Man extends EventEmitter {}
    
    var man = new Man();
    
    man.on('wakeup', wakeup);
    man.emit('wakeup');
    
    man.removeListener('wakeup', wakeup);
    man.emit('wakeup');
    
    // 输出如下:
    // man has woken up

    相关链接

    https://nodejs.org/api/events.html

     
  • 相关阅读:
    「SAP技术」SAP MM MB5M报表不显示特殊库存数据
    python-day3-条件判断与循环
    python-day2-运算符
    Mysql数据库意外崩溃导致表数据文件损坏无法启动的问题解决
    图书管理系统(Servlet+Jsp+Java+Mysql,附下载演示地址)
    求解最长递增子序列(LIS) | 动态规划(DP)+ 二分法
    HTML+CSS+JavaScript实现植物大战僵尸(附演示地址)
    面试官:如何在Integer类型的ArrayList中同时添加String、Character、Boolean等类型的数据? | Java反射高级应用
    面试官:手撕十大排序算法,你会几种?
    用x种方式求第n项斐波那契数,99%的人只会第一种
  • 原文地址:https://www.cnblogs.com/eret9616/p/9195872.html
Copyright © 2011-2022 走看看