深入理解JS异步编程二(分布式事件)

原创 2016年06月01日 08:20:45

PubSub模式

从原生的js角度,我们要监听某事件的方法就是利用addEventListener方法,但是当我们的页面趋于复杂,比如要向某个元素添加多个处理事件,那么就要用一个封装函数汇集多个处理函数

link.onclick = function() {
    clickHandler1.apply(this, arguments);
    clickHandler2.apply(this, arguments);
};

在jquery中,jquery.on()方法使用的比较多,在新版的jquery中,也舍弃了bind()方法,统一使用on,jQuery 将link 元素的事件发布给了任何想订阅此事件的人。

Node.js中的EventEmitter 对象
要想给EventEmitter 对象添加一个事件处理器,只要以事件类型和事件处理器为参数调用on 方法即可。

emitter.on('evacuate', function(message) {
    console.log(message);
});

emit(意为“触发”)方法负责调用给定事件类型的所有处理器。举个例子,下面这行代码:

emitter.emit('evacuate');

将调用evacuate 事件的所有处理器。

请注意,这里的术语事件跟事件队列没有任何关系。

使用emit 方法触发事件时,可以添加任意多的附加参数。所有参数均传递至所有处理器。

emitter.emit('evacuate', 'Woman and children first!');

实现一个PubSub模式

一个PubSub模型主要方法有3个,订阅,退订,发布

var PubSub = {};
// 用于储存事件队列
var queue = {};

// 订阅接口
PubSub.on = function(event, cb) {
  if (!queue[event]) {
    queue[event] = [];
  }
  queue[event].push(cb);
};

// 退订接口
PubSub.off = function(event, cb) {
  var currentEvent = queue[event];
  var len = 0;
  if (currentEvent) {
    len = currentEvent.length;
    for (var i = len - 1; i >= 0; i--) {
      if (currentEvent[i] === cb) {
        currentEvent.splice(i, 1);
      }
    }
  }
};

// 发布接口
PubSub.emit = function(event) {
  var currentEvent = queue[event];
  if (currentEvent) {
    for (var i = 0; i < currentEvent.length; i++) {
      currentEvent[i]();
    }
  }
};


//使用
// 订阅
var callbackA = function () {
    console.log('event a happened')
};
PubSub.on('a', callbackA);
PubSub.on('b', function() {
    console.log('event b happened')
});

// 退订 , 第二个参赛传入回调函数的引用
PubSub.off('a', callbackA);

// 发布
PubSub.emit('a');
PubSub.emit('b'); 
版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。

相关文章推荐

理解Node.js的事件驱动和异步编程

Node.js 是基于chrome V8 引擎的Javascript 的运行环境,使用了事件驱动和非阻塞式I/O模型 Node.js是单进程单线程的???擦擦擦读《node.js深入浅出》中,看到‘事...

深入理解JS异步编程三(promise)

Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Promise对象。

深入理解node.js异步编程:基础篇

1. 概述 目前开源社区最火热的技术当属Node.js莫属了,作为使用Javascript为主要开发语言的服务器端编程技术和平台,一开始就注定会引人瞩目。 当然能够吸引众人的目光,肯定不是三教九流之...

【Node.js基础篇】(七)Node异步编程之事件发射器

事件发射器是Node里除了回调函数外的另一十分重要的异步编程技术。 在MFC等图形界面编程库中,事件发射器是非常常见的,比如,鼠标点击事件,点击了鼠标后,就会触发鼠标点击后的函数——事件发射器触发事件...

深入理解javascript异步编程障眼法&&h5 web worker实现多线程

0.从一道题说起var t = true; setTimeout(function(){ t = false; }, 1000); while(t){ } alert('end');问,以上代码何...

多线程异步编程(2):创建多个线程执行任务,同时更新进度条,使用观察者模式,利用事件通知界面更新。移除对Form的引用,彻底解除界面与逻辑的耦合

效果图 1.创建线程参数类和事件参数类 public class ThreadParam     {         public int threadType;   ...

JS异步编程(promise、deferred对象)

本文主要是阅读了几篇文章之后整理出来的笔记。 需要弄清楚的几个概念: 首先要明白JS本身是单线程的,在处理一个任务的时候不可能去处理别的任务。也就是单凭JS是不可能异步编程的,必须借助一些别的...

一个简单效果用到的js特性(异步编程,匿名函数,闭包)

效果:轮询显示隐藏所有p标签,显示用打印机效果一个字符一个字符地显示,淡出隐藏准备知识 js异步编程(setInterval setTimeout) JS 本身是单线程运行的,不可能在一段代码还未...

浅谈JS异步编程——Promise

JS单线程的特点同时也决定了JS中异步编程的必要性,起初,我们常常使用回调函数来处理异步任务,但随着任务越来越复杂,回调函数的层层嵌套使得无论是代码还是开发人员看起来都十分痛苦。。。于是,可爱的Pro...

ES6---JS异步编程的几种解决方法及其优缺点

前言因项目需要从LiveScript转为ES6, 所以最近看了阮一峰的ES6教程,主要感兴趣的是ES6对JS的异步编程新的解决方案,ES6增加了promise和Generator等解决方法。现在我们来...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)