文档章节

Node.js:理解使用事件发射器模式简化事件绑定

刘纪君
 刘纪君
发布于 2014/06/07 20:59
字数 872
阅读 487
收藏 5
点赞 0
评论 0
 CommonJS标准 每个模块都由一个上下文将该模块与其他模块隔离

 标准的回调模式:
(CPS Continuation-passing style):后继传递风格
    异步编程风格是一种程序的流程控制权以后继的形式被显式的传递的编程风格。
    按后继传递风格编写的函数以一个显式的"后继"作为额外的参数,"后继"实际
    上是一个函数,当CPS函数计算出返回值时,它就调用后继函数,并将  CPS
    函数的返回值作为参数。这种模式能够很好的处理函数执行结束后需要通知客户端的情况。

var fs = require('fs');
fs.readFile('/etc/passwd',function(err,fileContent){
    if(err){
        throw err;
    }
    console.log("fileContent " + fileContent.toString());
});
//回调函数第一个参数是一个错误对象,如果有错误发生,这个参数就是Error的一个实例,这就是比Node中的应用CPS编程的一般模式。

理解事件发射器模式:
事件发射器:可以发射事件的对象。
事件监听器:绑定到事件发射器上的代码,负责监听特定类型的事件。

理解事件类型:
发射的事件具有一定的类型,类型用一个字符串表示如"data","end","on" 等,他们都是由事件发射器定义的任意字符串。当你使用到API时
应该会有对应的文档记录他能够发射的事件类型。 一旦有事件发生,事件发射器就会调用相应的事件监听器,并将相关数据作为参数传递给事件监听器。
虽然事件发生器时服务任意类型事件的通用接口,但在Node的实现中有一个特例即error事件,Node中大多数事件发射器实现在程序发生错误时都会发射"error"事件,所以都要监听这个错误事件,防止向上抛出异常。

应用事件发射器API:
    任何实现了事件发射器模式的对象(例如:TCP http等)都实现了:
    1:addListener 和on ->为指定的事件添加事件监听器
    2:once->为指定的事件添加只会调用一次的事件监听器
    3:removeEventListener ->删除绑定到指定事件上的某个指定的事件监听器。
    4:removeAllEventListener ->删除绑定到指定事件上的全部的事件监听器。
允许绑定多个事件监听器。根据事件类型,事件发射器负责按照事件所绑定的监听器的注册顺序依次调用事件监听器。这就意味着:
    1:某个事件监听器也许并不会在事件发射之后就立即被调用,也许在它之前还有别的事件监听器被调用。
    2:异常被抛出到堆栈并不正常,他通常时有代码中的错误引起的。

创建事件发射器:
    1:从Node事件发射器继承
        var util = require('util');
        var eventEmitter = require('events').EventEmitter;
        var myClass = function(){}
        util.inherits(myClass,eventEmitter);//util.inherits建立了一条原型链,使myClass类实例能够使用EventEmitter的原型方法

















© 著作权归作者所有

共有 人打赏支持
刘纪君
粉丝 29
博文 78
码字总数 59637
作品 0
郑州
高级程序员
ReactiveCocoa - Swift 解读系列一:信号的创建以及发送事件

最近花了一点时间去学习ReactiveSwift(以下称RAS),这是一款基于ReactiveCocoa开发的Swift框架,由于这个框架大量使用了函数式编程和响应式编程的结合,所以它也被称之为函数相应式编程 --...

BennyLoo ⋅ 2017/11/16 ⋅ 0

NodeJS 事件循环

Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。 Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。 Node.js 基本...

我语文超级不好 ⋅ 2016/11/09 ⋅ 0

websocket与node.js的完美结合

本文为原创文章,出自http://cnodejs.org,转载请注明出处和作者 作者:kongwu 原文:http://cnodejs.org/blog/?p=273 之所以写下此文,是我觉得越是简单的技术往往能发挥越重要的作用,随着...

红薯 ⋅ 2011/03/20 ⋅ 2

[Node.js源码解读(1)]Node.js的启动过程

本文原载于https://github.com/DavidCai1993/my-blog/issues/26 经原作者授权连载于alinode官方博客,未经原作者允许,不得转载。 大家可能会好奇,在 Node.js 启动后,第一个执行的 JavaSc...

_朴灵_ ⋅ 05/14 ⋅ 0

从0开始用Nodejs做一个聊天室

Cover 效果图 老样子,还是先放个效果图,动态图,有点大(4M)请耐心等加载。 随便说说 最近在做东西的时候有一个对战功能,需要用到Socket技术,于是了解了一番相关的实现方案,最后选择了...

iimT ⋅ 05/13 ⋅ 0

Node.js process 模块解读

process存在于全局对象上,不需要使用require()加载即可使用,process模块主要做两方面的事情 获取进程信息(资源使用、运行环境、运行状态) 执行进程操作(监听事件、调度任务、发出警告)...

Randal ⋅ 05/30 ⋅ 0

Node.js child_process模块解读

在介绍child_process模块之前,先来看一个例子。 可以试一下使用上面的代码启动Node.js服务,然后打开两个浏览器选项卡分别访问/compute和/,可以发现node服务接收到/compute请求时会进行大量...

Randal ⋅ 06/01 ⋅ 0

【深入浅出Node.js系列一】什么是Node.js

深入浅出Node.js系列 【深入浅出Node.js系列一】什么是Node.js 有关Node.js的技术报道越来越多,Node.js的写法也是五花八门,有写成 NodeJS的,有写成Nodejs的,到底哪一种写法最标准呢,我们不妨...

陶邦仁 ⋅ 2016/01/07 ⋅ 0

Node.js 流(stream):你需要知道的一切

Node.js 流(stream):你需要知道的一切 const wc = ... // wc 输入流grep.pipe(wc) const file = fs.createWriteStream('./big.file');for(let i = 0;i<=1e6;i++) { }file.end(); const se......

前端开发-晓 ⋅ 06/11 ⋅ 0

NodeJS优缺点及适用场景讨论

NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”,那么它的出现是为了解决什么问题呢,它有什么优缺点以及它适用于什么场景呢? 我关于node.js长处的理解: 1、node.js通...

金馆长1 ⋅ 2015/09/17 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 33分钟前 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

vim编辑模式、vim命令模式、vim实践

vim编辑模式 编辑模式用来输入或修改文本内容,编辑模式除了Esc外其他键几乎都是输入 如何进入编辑模式 一般模式输入以下按键,均可进入编辑模式,左下角提示 insert(中文为插入) 字样 i ...

蛋黄Yolks ⋅ 昨天 ⋅ 0

大数据入门基础:SSH介绍

什么是ssh 简单说,SSH是一种网络协议,用于计算机之间的加密登录。 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码...

董黎明 ⋅ 昨天 ⋅ 0

web3j教程

web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 汇智网最新发布的web3j教程,详细讲解...

汇智网教程 ⋅ 昨天 ⋅ 0

谷歌:安全问题机制并不如你想象中安全

腾讯科技讯 5月25日,如今的你或许已经对许多网站所使用的“安全问题机制”习以为常了,但你真的认为包括“你第一个宠物的名字是什么?”这些问题能够保障你的帐户安全吗? 根据谷歌(微博)安...

问题终结者 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部