美文网首页
js 观察者和发布订阅

js 观察者和发布订阅

作者: Super曲江龙Kimi | 来源:发表于2019-08-17 22:36 被阅读0次

发布订阅

js中的事件模型就是基于发布订阅设计的。相当于订报的人和送报人的关系。js中很多都有发布订阅的思想。具体上代码。

const fs = require('fs');

let e = {
    arr: [],
    on(fn) {
        this.arr.push(fn);
    }
    emit() {
        this.arr.forEach(fn => fn());
    }
}
e.on(() => {
    console.log('订阅者1');
})
e.on(() => {
    console.log('订阅者2');
})
fs.readFile('name.txt', 'utf8', (err) => {
    e.emit();
})

// 只要文件读取成功后就会发布一个通知。然后执行所有订阅者的回调方法

从图中可以看出。发布者和订阅者是没有关系的。通过事件中心来做中介。订阅者可以通过on方法将自己的回调添加进订阅者队列。而发布者可以通过调用emit方法来通知订阅者执行回调。

4.png

观察者模式

class Sub {
  constructor() {
    this.arr = [];
    this.name = 'kimi'
  }
  addWatcher(o) {
    this.arr.push(o)
  }
  rename(newName) {
    this.name = newName;
    this.arr.forEach(o => o.update(newName));
  }
}

class Observer {
    update(newName) {
        // do something
    }
}

let sub = new Sub();  
let o1 = new Observer();  
let o2 = new Observer();  
sub.addWatcher(o1);  // 添加第一位观察者
sub.addWatcher(o2);  // 添加第二位观察者
sub.rename('bob');  // 被观察者变化后通知观察者,调用观察者身上的update方法

观察者模式在前端中应用非常广泛。比如vue源码中。一个data可能有很多watcher观察者。render-watcher、computed-watcher、data-watcher。一旦数据发生变化就会通知观察者,调用他们自己的update方法。

总结:

  1. 观察者模式中 观察者和被观察者一般是有关系的。而发布者和订阅者是没有关系的
  2. 观察者模式中一般都会包含发布订阅。
  3. js中的事件,就是最好的发布订阅模型。
  4. 数据视图双向绑定的框架都离不开观察者模式。

相关文章

网友评论

      本文标题:js 观察者和发布订阅

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