DOM事件

最基础的发布订阅模式

标准浏览器下用dispatchEvent

观察者模式和发布订阅的区别

观察者模式 vs 发布订阅模式

发布订阅模式通用实现

  1. var event = (function () {
  2. var clientList: {};
  3. // 订阅
  4. var listen = function (key, fn) {
  5. if (clientList[key]) {
  6. clientList[key] = [];
  7. }
  8. this.clientList[key].push(fn);
  9. };
  10. / 发布
  11. var trigger = function (key, args) {
  12. var fns = clientList[key];
  13. if (!fns || !fns.length) {
  14. return;
  15. }
  16. for (var i = 0; fn; fn = fns[i++]) {
  17. fn.apply(this, args);
  18. }
  19. };
  20. var remove = function (key, fn) {
  21. var fns = clientList[key];
  22. if (!fns) {
  23. return false;
  24. }
  25. if (!fn) {
  26. fns && (fns.length = 0);
  27. } else {
  28. for (var len = fns.length - 1; len >= 0; len--) {
  29. var _fn = fns[len];
  30. if (_fn === fn) {
  31. fns.splice(len, 1);
  32. }
  33. }
  34. };
  35. }
  36. })();
  37. // 给所有对象动态安装发布-订阅功能
  38. var installEvent = function (obj) {
  39. for (var i of Object.keys(event)) {
  40. obj[i] = event[i];
  41. }
  42. }
  43. Event.listen('squareMeter88', function (price) { // 小红订阅消息
  44. console.log('价格=' + price); // 输出:‘价格=2000000’
  45. });
  46. Event.trigger('squareMeter88', 2000000); // 售楼处发布消息

必须先订阅再发布吗

  • QQ离线消息
  • 本来是ajax请求完成后渲染模块,但是可能在请求返回后,模块还没加载好(还没有订阅相应事件)

=> 书上代码不够好
=> 可以看Rxjs的BehaviorSubject源码

推模型和拉模型

推模型:事件发生时发布者把所有状态和数据推送给订阅者
拉模型:发布者公开接口,订阅者按需获取
Javascript使用推模型