zoukankan      html  css  js  c++  java
  • NodeJS学习笔记(四) events,util模块

    开发指南中讲到的node核心模块有events,util,fs,http。介于篇幅的原因,在这里我想分两个次总结笔记。

    Events模块

    Events是node最重要的模块。Nodejs本身架构就是基于事件的。

    Event.EventEmitter

        àEventEmitter.on(event,listener) //注册一个时间,事件名为event,相应事件的回调函数为listener

        à EventEmitter.emit(event,[arg1],[arg2],[…])//args为发射已注册的事件event,并传递若干个args参数

        à EventEmitter.once(event,listener)//单词监听事件,时间最多只能触发一次,出发后该注册的event时间会解除监听

        à EventEmitter.removeListrner(event,listener)//解除已监听了的事件

        à EventEmitter.removeListrner(event,listener)

    Node中已经有定义好的事件,比如说error事件。当error被发射时(emit),如果eventEmitter没有响应的监听器,node会把它当作一场,并退出程序打印调用栈

    1. var events = require('events');
    2. var emitter = new events.EventEmitter();
    3.  
    4. emitter.on('someEvent', function(arg1, arg2) {
    5.   console.log('listener1', arg1, arg2);
    6. });
    7. emitter.on('someEvent', function(arg1, arg2) {
    8.   console.log('listener2', arg1, arg2);
    9. });
    10.  
    11. emitter.emit('someEvent', 'wenlonghor', 'helloWorld');

    上面代码中定义了两个同名的someEvent事件。Node会根据两个时间的监听器调用相关回调函数。

    打印结果

    通常情况下,不会直接使用EventEmitter,而是使用继承他的方式。

    Util模块

    文中讲到了util的两个API:util.inherits和util.inspect

    util.inherits:

    util.inherits(constructor,superConstructor).这个是node包装好的用于实现继承的方法。在javascript中的继承和java中的不太一样。开发指南中对它的解释挺有意思:

    "基于类的语言中类就像一个模具,对象有这个模具浇注产生,而基于原型的语言中,原想就好像一件艺术品的原件,我们通过以太100%精确的机器把这个原件复制出很多分"

    Node包装好的这个继承只能继承父类中在原型中定义的函数:

    1. var util = require('util');
    2.  
    3. function Base() {
    4.   this.name = 'base';
    5.   this.base = 1991;
    6.  
    7.   this.sayHello = function() {
    8.     console.log('Hello ' + this.name);
    9.   };
    10. }
    11. Base.prototype.showName = function() {
    12.   console.log(this.name);
    13. };
    14. function Sub() {
    15.   this.name = 'sub';
    16. }
    17.  
    18. util.inherits(Sub, Base);
    19. var objBase = new Base();
    20. objBase.showName();
    21. objBase.sayHello();
    22. console.log(objBase);
    23.  
    24. var objSub = new Sub();
    25. objSub.showName();
    26. //objSub.sayHello();
    27. console.log(objSub);

    结果:

    可以看到,使用过原型定义的函数shouName能够正常输出。代码段中26行把sayHello()注释掉,因为sub中没有继承到base的sayHello()方法,会抛出异常:

    这当然不是这两个API的全部用法,只是适用于初学node掌握node的特性。由于node是异步的方式,在多事件写作的时候会有控制流的问题。以后深入研究后会在这里补上笔记!

    Util.inspect

    在我理解看来,这个方法有点像java里面的toString()

    Util.inspect(Object,[shouHidden],[depth],[colors])

    Object:既要转换的对象

    showHidden:如果设置为true,相识更多隐藏信息

    depth:表示最大递归的层数。如果不指定,默认递归两层。指定为null,不限制层数的递归

    color:用于显示颜色

    下面用一个例子展现

  • 相关阅读:
    ubuntu apt 命令相关
    linux 常用命令
    sqli-labs 通关详解(sql注入知识点整理)
    运维手册2---查看机子的系统信息
    运维手册1---ssh命令:使用密钥文件进行登陆
    Java中的==和equals,常量池
    Java Persistence
    VSCode常用插件汇总
    VSCode常用插件之Auto Rename Tag使用
    ESLint 使用指南
  • 原文地址:https://www.cnblogs.com/wenlonghor/p/3309527.html
Copyright © 2011-2022 走看看