JS观察者模式与NodeJS自定义事件

class Subject{
    constructor(){
        this.state = 0;
        this.observers = [];
    }
    setState(state){
        this.state = state;
        this.notifyAllObservers();
    }
    getState(){
        return this.state;
    }
    notifyAllObservers(){
        this.observers.forEach(observer => {
            observer.update()
        })
    }
    attach(observer){
        this.observers.push(observer)
    }
}

class Observer{
    constructor(name,subject){
        this.name = name;
        this.subject = subject;
        this.subject.attach(this)
    }
    update(){
        console.log(`${this.name} update , state ${this.subject.getState()}`);
    }
}

let s = new Subject()
let o1 = new Observer('o1',s);
s.setState(1)

const EventEmitter = require('events').EventEmitter;
class Dog extends EventEmitter{
    constructor(name){
        super()//这个一定要写吗
        this.name = name
    }
}

let simon = new Dog('simon');
simon.on('bark',function(){
    console.log(this.name,' brak')
})

setInterval(function(){
    simon.emit('bark')
},1000)

nodeJS 的自定义事件是 js 观察者模式的一个应用场景

 

const fs = require('fs')
const readStream = fs.createReadStream('./data/file.txt')
let length = 0
readStream.on('data',function(chunk){
    let len = chunk.toString().length
    console.log('len ',len)
    length += len
})
readStream.on('end',function(){
    console.log('length',length)
})

nodeJS 的流的方式也是观察者模式中的一种实现的场景

on('data') 的意思是如果这个的文件一下子读取如果文件过大可能一下子就会拉满整个内存 使用的流的方式就是加了个水龙头他会一点一点的读取流的 直到 on('end') 其实这个流还有很多API 以后再去了解

 

const fs = require('fs')
const readLine = require('readline')
let rl = readLine.createInterface({
    input:fs.createReadStream('./data/file.txt')
})
let lineNum = 0;
rl.on('line',function(line){
    console.log('line ',line)
    lineNum++;
})
rl.on('close',function(){
    console.log('lineNum',lineNum)
})

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值