promise - 3.发布订阅和观察者模式

1. 发布订阅

  • 大白话解释

订阅好一件事,当这件事发生的时候,触发对应的函数
订阅: on
发布:emit
promise 内部也是基于发布订阅的

  1. 好处

多个类之间可以解耦合

  1. 特点

订阅方和发布方没有任何的关系

  1. 实现
let fs = require('fs')
let e = {
    _obj: {},
    _callback: [],
    on(callBack) { // 订阅就是将函数放到数组中
        this._callback.push(callBack)
    },
    emit(key, val) {
        this._obj[key] = val // 让订阅的数组中的方法依次执行
        this._callback.forEach(method => {
            method(this._obj)
        })
    }
}
e.on(function(obj) { // 每次发布都会触发此函数
    console.log(obj); // 用户根据结果自己决定输出
})
fs.readFile('./testfile/name.txt', 'utf8', (err, data) => {
    e.emit('name', data)
})
fs.readFile('./testfile/age.txt', 'utf8', (err, data) => {
    e.emit('age', data)
})

2. 观察者

  • 大白话解释

观察者和被观察者是有关联的
观察者需要将自己放到被观察者之上
当被观察者状态发生变化的时候,需要通知所有的观察者

  • 实例
/**
 * 实例场景
 * 1. 我家有个小宝宝 我要监控小宝宝的状态  -  小宝宝就是被观察者 , 我就是观察者
 * 2. 小宝宝的状态是 开心 / 不开心
 */

class Observer { // 观察者
    constructor(name) {
        this.name = name
    }
    update(s) { // 等会被观察者的状态发生变化的时候会调用这个方法
        console.log(`${this.name}说,${s.name}当前的状态是${s.state}`);
    }
}

class Subject { // 被观察者
    constructor(name) {
        this.name = name
        this.state = '开心'
        this.observers = [] // 这里存的是观察者
    }
    attach(o) { // 需要将注册者放到自己身上,也就是说需要小宝宝同意你的观察
        this.observers.push(o)
    }
    setData(state) {
        this.state = state
        this.observers.forEach(o => {
            o.update(this)
        })
    }
}

let baby = new Subject('小宝宝')
let parent = new Observer('爸爸')
let mother = new Observer('妈妈')
baby.attach(parent)
baby.attach(mother)
baby.setData('不开心')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值