本节书摘来自异步社区《Node应用程序构建——使用MongoDB和Backbone》一书中的第2章,第2.3节,作者【美】Mike Wilson,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.3 事件

Node应用程序构建——使用MongoDB和Backbone
事件是Node.js的活力之源,实际上也是JavaScript本身的活力之源。其他语言在多个并发线程中处理工作流,每个线程都将大部分时间花在等待阻塞的I/O操作上,如磁盘读取、数据库操作或通过网络获取信息。但JavaScript总被认为是一个基于事件的编程模型。早期的事件很简单,如一次鼠标点击、一个页面加载或一次表单提交。更晚期的用法包括完成一次数据库写入,或从磁盘读入文件的内容等事件。

JavaScript利用回调,通过另一种方式来解决问题。程序员编写称为“回调”的特殊函数,让它与特定的事件挂钩,在符合条件时执行,而不是管理长时间运行的进程。例2-1和例2-2的路由例子说明了这一点:Node.js为每个URL设置了特定的响应,然后只在Web浏览器访问这些路由时执行相应的代码。

Node.js包括一个专门的事件库可以供你准备自定义事件。假设你有一个网络应用程序,已经开放给其他开发人员。如果他们想扩展你的工作,有两种选择:基于你的代码创建一些原型函数,并重写所有行为不同的函数,或者直接修改你的代码,构建他们需要的特性。事件给出了第三种选择:在你的代码的特定位置触发一个事件,让所有监听者知道动作已发生,并注入他们自己的行为。

例如,如果你的应用程序包含一个登录功能,你可能有一个OnLoggedIn事件。后继的开发人员可以添加一个监听器来提供额外的功能,如连接到社交网站收集所有与登录者相关的新闻。

例2-6 创建与处理应用程序事件


例2-6展示了怎样将3个无关的事件onApplicationStart、onApplicationRun和onApplicationStop串在一起,产生下面的输出。


在mainLoop函数执行之前,调用eventEmitter的on方法注册了ApplicationStart、ApplicationRun和ApplicationStop事件。这为每一个事件增加了一个事件监听器:从现在起,只要有事件发生,都会检查这些监听器是否匹配,匹配的回调函数将被执行。

屏幕输出突出了Node.js的一个重要特征:所有工作都在单个线程中进行。当事件发生并由回调响应时,调用方法会暂停直到回调执行完毕。这很重要,因为如果在回调期间发生了消耗大量运算资源的事情,原始函数将不会继续执行,直到全部工作完成。所以这个例子的执行遵循以下路线。

1.运行mainLoop,触发ApplicationStartEvent。

2.运行回调onApplicationStart。

3.继续执行mainLoop,触发ApplicationRun。

4.运行回调onApplicationRun。

5.继续执行mainLoop,触发ApplicationStop。

6.运行回调onApplicationStop。

7.回到mainLoop的执行,接下去没什么可做的,停止。

《Node应用程序构建——使用MongoDB和Backbone》一2.3 事件相关推荐

  1. 《Node应用程序构建——使用MongoDB和Backbone》一第 1 章 介绍与总览1.1 打造一个社交网络...

    本节书摘来自异步社区<Node应用程序构建--使用MongoDB和Backbone>一书中的第1章,第1.1节,作者[美]Mike Wilson,更多章节内容可以访问云栖社区"异 ...

  2. node mongoose_如何使用Express,Mongoose和Socket.io在Node.js中构建实时聊天应用程序

    node mongoose by Arun Mathew Kurian 通过阿伦·马修·库里安(Arun Mathew Kurian) 如何使用Express,Mongoose和Socket.io在N ...

  3. 连接Python 3和Electron/Node.JS:构建现代桌面应用程序

    目录 先决条件 第1步--设置开发环境 安装Node.js和NPM 设置Python虚拟环境 创建虚拟环境 第4步--创建Node.js应用程序 如何在Electron和Python之间进行通讯 什么 ...

  4. react node服务器_适用于初学者的服务器上的React:构建通用的React和Node应用程序...

    react node服务器 In this article we are going to learn how to build a simple "Universal JavaScript ...

  5. 基于 Egg.js 框架的 Node.js 服务构建之用户管理设计

    转载需经本人同意且标注本文原始地址:https://zhaomenghuan.github.io/blog/nodejs-eggjs-usersytem.html 前言 近来公司需要构建一套 EMM( ...

  6. node aws 内存溢出_在AWS Elastic Beanstalk上运行生产Node应用程序的现实

    node aws 内存溢出 by Jared Nutt 贾里德·努特(Jared Nutt) 在AWS Elastic Beanstalk上运行生产Node应用程序的现实 (The reality o ...

  7. 如何在Windows上安装Angular:Angular CLI,Node.js和构建工具指南

    In this tutorial, we'll learn how to install Angular CLI in Windows and use it to create an Angular ...

  8. 基于 Egg.js 框架的 Node.js 服务构建之用户管理设计 1

    前言 近来公司需要构建一套 EMM(Enterprise Mobility Management)的管理平台,就这种面向企业的应用管理本身需要考虑的需求是十分复杂的,技术层面管理端和服务端构建是架构核 ...

  9. mongodb连接java_如何从Java EE无状态应用程序连接到MongoDB

    mongodb连接java 在本文中,我将介绍如何从无状态Java EE应用程序连接到MongoDB,以利用与MongoDB Java驱动程序提供的数据库的内置连接池. 如果您开发的REST API对 ...

  10. 如何从Java EE无状态应用程序连接到MongoDB

    在本文中,我将介绍如何从无状态Java EE应用程序连接到MongoDB,以利用与MongoDB Java驱动程序提供的数据库的内置连接池. 如果您开发的REST API对MongoDB执行操作,则可 ...

最新文章

  1. 如何查看别人公众号自定义菜单的功能_如何注册自己的个人公众号?手把手教您开启自媒体赚钱之路?...
  2. 1322项!这所高校国自然基金立项再创新高 | 附各高校最新统计
  3. 在Android上实现HttpServer
  4. vue官方eslint插件配置eslint-plugin-vue-libs
  5. azure备份存储层分类_如何配置Azure SQL数据库长期保留(LTR)备份
  6. DVB开发之OTA升级
  7. 每周荐书:OpenCV、自然语言、SpringBoot2
  8. web文件服务器1台,WEB服务器及配件1台 - 千里马招标网
  9. 附加数据库及配置ODBC的方法
  10. 新版智能广告点击要饭网单页网站源码
  11. HYSBZ 1406 密码箱
  12. Swift学习笔记 -- 枚举和结构
  13. 利用网页内容监控来提升网站收录排名
  14. python层次分析法案例_在R语言中使用层次分析法-案例1
  15. 线段树:你能回答这些问题吗
  16. 一名菜鸟程序员的跳槽经历以及其所感所想(二)
  17. openwrt mesh网络设置
  18. 线性代数(九) : 矩阵的行简化阶梯型和标准型
  19. ensp使用web登录防火墙
  20. revit相关报错合集

热门文章

  1. leecode 树是否是平衡树 java
  2. UVA 12299 - RMQ with Shifts 线段树
  3. quartus编译出现的问题
  4. Delphi 与 DirectX 之 DelphiX(63): TDIB.DoPosterize();
  5. 没使用Spring Cloud的版本管理导致Eureka服务无法注册到Eureka服务注册中心
  6. redis哨兵配置和redis-cluster搭建
  7. 编程大讲坛:C#核心开发技术从入门到精通pdf
  8. Kali Linux桥接模式配置DNS服务器
  9. vue2.0路由(跳转和传参)经典介绍
  10. 设计模式 笔记 享元模式 Flyweight