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

     
  • 相关阅读:
    简单的模板解析函数
    HTML通过事件传递参数到js 二 event
    HTML通过事件传递参数到js一
    通过this获取当前点击选项相关数据
    LeetCode 20. 有效的括号(Valid Parentheses)
    LeetCode 459. 重复的子字符串(Repeated Substring Pattern)
    LeetCode 14. 最长公共前缀(Longest Common Prefix)
    LeetCode 168. Excel表列名称(Excel Sheet Column Title)
    LeetCode 171. Excel表列序号(Excel Sheet Column Number) 22
    LeetCode 665. 非递减数列(Non-decreasing Array)
  • 原文地址:https://www.cnblogs.com/eret9616/p/9195872.html
Copyright © 2011-2022 走看看