美文网首页
node核心模块

node核心模块

作者: 田成力 | 来源:发表于2019-10-10 20:19 被阅读0次

Node的核心模块

util.promisify 将普通的回调函数,转换成promise函数

但必须是规范的Node方法(一定要满足错误优先的规则)
使用util.promisify的例子

//ncp模块是copy文件/文件夹的第三方模块
let ncp = require('ncp');
let path = require('path')
let util = require('util')
ncp = util.promisify(ncp);
ncp(path.join(__dirname, './1.txt'), path.join(__dirname, './2.txt'), (err) => {
  if (err) {
    return console.log("copy has some error");
  }
  console.log("copy success");
});

//那么如何实现util.promisify功能的呢
function promisify(fn) {
  return (...args) => {
    return new Promise((resolve, reject) => {
      fn(...args, (err, data) => {
        if (err) {
          return reject(err)
        }
        return resolve(data);
      });
    })
  }
}

util.inherits 继承,不过现在都使用class了

注意:使用til.inherits只能继承公共方法

//原来的写法:
function Parent(type) {
  this.type = type;
  console.log("type==>",type);
  
}
Parent.prototype.getType = function () {
  return this.type;
}
function Child(name,type) {
  this.name = name;
  Parent.call(this,type);
}

Reflect.setPrototypeOf(Child.prototype, Parent.prototype);

let zhangsan = new Child('zhangsan','person');
console.log(zhangsan.name);
console.log(zhangsan.type);
console.log(zhangsan.getType());

//使用util.inherits的写法:
const util=require('util')
function Parent(type) {
  this.type = type;
  console.log("type==>",type);
  
}
Parent.prototype.getType = function () {
  return this.type;
}
function Child(name,type) {
  this.name = name;
  Parent.call(this,type);
}

util.inherits(Child,Parent);
let zhangsan = new Child('zhangsan','person');
console.log(zhangsan.name);
console.log(zhangsan.type);
console.log(zhangsan.getType());

util.inspect 可以查看到隐藏属性

util.inspect(Array.prototype)
//可查看到Array原型上的全部方法

事件模块

//基本使用:
const Events=require('events');
let event=new Events();
function myEvent(){
  console.log("in myEvent");
}
event.on('myevent',myEvent);

event.emit('myevent');

//如果我的自定义类想使用Event呢?
const Events = require('events');
// let event=new Events();
class MyEvent extends Events {

}
myEvent = new MyEvent();
function myEvent1() {
  console.log("in myEvent");
}
myEvent.on('myevent', myEvent1);

myEvent.emit('myevent');

//如何自己实现一个Event?
class Events {
  constructor() {
    this.eventList = {};
  }
  on(eventName, eventCallback) {
    if (this.eventList[eventName]) {
      this.eventList[eventName].push(eventCallback)
    } else {
      this.eventList[eventName] = [eventCallback];
    }
  }
  emit(eventName) {
    let events = this.eventList[eventName];
    events.forEach(item => {
      item();
    });
  }
}
class MyEvent extends Events {

}
myEvent = new MyEvent();
function myEvent1() {
  console.log("in myEvent");
}
myEvent.on('myevent', myEvent1);

myEvent.emit('myevent');

Evnets的 newListener 监听用户监听了哪些监听


const Events=require('events');
const eventEmitter=new Events();
//只要用户监听了任意事件,都会执行该回调
eventEmitter.on('newListener',(type)=>{
  console.log(type)
})

自己写的完整版本

class MyEvents {
  constructor() {
    this._events = {};
  }


  on(eventName, callback) {
    this._events[eventName] = this._events[eventName] ? this._events[eventName] : [];
    if (eventName !== 'newListener') {
      //如果是绑定的特殊的监听器
      this.emit('newListener', eventName);
    }
    this._events[eventName].push(callback);
  }

  once(eventName, callback) {
    //绑定一次,当执行完成后再解绑
    const one = (...args) => {
      callback(...args);
      this.off(eventName, one);
    }
    one.callback = callback;
    this.on(eventName, one);
  }

  emit(eventName, ...args) {
    this._events[eventName] = this._events[eventName] ? this._events[eventName] : [];
    this._events[eventName].forEach(callback => {
      callback(...args);
    });
  }

  off(eventName, callback) {
    console.log("off",callback);
    
    this._events[eventName] = this._events[eventName] ? this._events[eventName] : [];
    this._events[eventName] = this._events[eventName].filter(item => {
      console.log(item.callback);
      
      if (item === callback || item.callback === callback) {        
        return false;
      }
      return true;
    })
  }
}

class Person extends MyEvents{

}

let zhangsan=new Person();
let cf=function(){
  console.log("吃饭");
}
let sj=function(name){
  console.log(name,"睡觉");
}

let sj2=function(name){
  console.log(name,"睡觉");
}


zhangsan.on('newListener',(eventName)=>{
  if (eventName==='饱了') {
    console.log("又想睡觉了");
  }
})

zhangsan.on('饿了',cf)
zhangsan.on('饱了',sj)
zhangsan.once('饱了2',sj2)
zhangsan.off('饱了2',sj2)
zhangsan.emit('饿了');
zhangsan.emit('饱了','张三');
zhangsan.emit('饱了','李四');
zhangsan.emit('饱了2','张三2');
zhangsan.emit('饱了2','李四2');

相关文章

  • Node.js基础-模块

    Node中的JavaScript ECMAScript 核心模块 第三方模块 用户自定义模块 核心模块 Node为...

  • 2018-08-20第五天课

    内置模块 => 直接使用 Node 提供好的核心模块 Event 事件模块事件模块是整个 Node.js ...

  • Node之模块与npm包管理器

    核心模块与文件模块 在Node.js中,以模块为单位划分所有功能。核心模块为Node内置模块,还有一些第三方的模块...

  • Node.js 核心模块概述

    模块加载原理与加载方式 Node 中的模块:核心模块/原生模块:Node提供的模块。文件模块:用户编写的模块。 N...

  • Nodejs学习第8天

    Events - events模块是Node.js的核心模块、核心API之一,它是Node.js事件驱动模型的核...

  • 那些年成为node攻城狮的路(二)

    模块加载机制浅析 node中模块分为核心模块和文件模块两大类,核心模块诸如fs、http、util...,文件模块...

  • node核心模块

    1.http --- 网络请求 var http = require("http"); var se...

  • node核心模块

    1、全局对象 JavaScript中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都...

  • Node核心模块

    buffer 无需引用,node内置 parseInt('f', 16)结果为15 Buffer.alloc(5)...

  • node核心模块

    Node的核心模块 util.promisify 将普通的回调函数,转换成promise函数 但必须是规范的Nod...

网友评论

      本文标题:node核心模块

      本文链接:https://www.haomeiwen.com/subject/gzhnpctx.html