用订阅/发布者模式解决异步函数结果依赖的问题

  我们都知道node是基于事件无阻塞i/o模型的,所以说大部分函数都是以异步实现的,请看下面代码:

 

db.query(sql1, function (err, data) {//code
})db.query(sql2, function (err, data) {//code
})

 

  如果我们上述两个操作,结果之间没有什么联系,那很好,基于node的I/O无阻塞模型,每个操作都做着自己的事情,美滋滋~

  但是在一些情况下这两个操作的结果有联系的,比如说第一个操作从数据库中取出一个人的姓,第二个操作从数据库中取出同一个人的名。

  假设我们有一个需求就是我们要把这两个操作的结果组合起来变成一个人的姓名(这个操作貌似有点浮夸,嘻嘻),也就是说我们要组合成姓名这个操作必须是在姓和名都取到的情况下才能进行,可达鸭眉头一皱,发现事情并不简单。我们知道上述两个操作是异步操作,他们何时结束我们根本不能知道,只知道他结束时会执行回调函数。下面我们就用订阅发布者模式来解决它。请看下面代码:

 

var count = 0;
var results = {};
var done = function (key, value) {  //订阅,姓和名进行订阅results[key] = value;count++;if(count === 2) {//发布,也就是执行刚刚说的组成姓名的操作
var name = results.lastName + results.firtName;
}}db.query(sql1, function (err, data) {//这里data我们假设是从数据库取到姓done("lastName", data); })db.query(sql2, function (err, data) {//这里data我们假设是从数据库取到名done("firstName", data); })

 

这样一来,每个i/o完成都会执行done方法,把取到的数据存到results对象中,也就是订阅,而当订阅数等于2的时候,也就是两个操作都完成并且都把数据存在results中了,那么就可以发布,也就是执行组成姓名的操作。利用订阅/发布者模式实现多对一,基本完成了我们的需求,但是这样的代码是丑陋的,我们用闭包和偏函数把代码优化并且抽象一下,以适合更多的需求。改进代码如下:

 

var after = function (times, callback) {var count = 0,results = {};return function (key, value) {results[key] = value;count++;if(count === times) {callback();}};
};//对闭包的引用
var done = after(times, render);

 

ps:利用node的events模块我们还可以实现订阅/发布者的多对多模式。

参考资料:深入浅出Node.js第4章

 

转载于:https://www.cnblogs.com/yonglin/p/7868062.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在集成测试中模拟耗时的动作

最近在我的一个项目中,我遇到一种情况,需要为该应用程序创建集成测试。 这不是很奇怪,不是吗? 有趣的是,该应用程序的逻辑涉及一些并发问题,并且其中一个组件必须连接到外部服务,这将花费几秒钟…

html基础-html简介-第一个网页(1)

今天刚刚开通博客园,把我最近整理的html/css来说一下,对于初学者还是有一定的帮助。 一、先来为大家简单普及以下html (1)、html英文即:hypertext markup language 中译 : 超文本标记语言 (2&…

javafx android sdk,JavaFX打包到Android上

让JavaFX运行到移动平台一直是社区努力完成的事。当然,目前已经可以让JavaFX运行到Android和IOS平台了,下面我们来看看如何打包自己的JavaFX项目到Android平台。这个示例是我从打包官方示例的例子里修改而来,用于打包一个简单的JavaFX程序。示…

在zookeeper集群的基础上,搭建伪solrCloud集群

伪集群的搭建:将solrCloud搭建到同一台机器上。 准备工作 1 将在window中部署的单机版solr上传到服务器(虚拟机)中 solr的简单部署:在tomcat中启动slor 的内容 这一次放到 mkdir /usr/local/solr-cloud 文件夹内并解压 2 复制4份…

Python-IndexError: list index out of range

Error:IndexError: list index out of range Where? 对Python中有序序列进行按索引取值的时候,出现这个异常 Why? 对于有序序列: 字符串 str 、列表 list 、元组 tuple进行按索引取值的时候,默认范围为 0 ~ len(有序序列)-1&…

摆脱困境:向REST API添加验证

我对此感到有些to愧,但直到昨天,我才知道我可以使用Valid和RequestBody批注将验证添加到REST API中。 这在Spring MVC 3.0中不起作用,由于某种原因,我没有注意到在Spring MVC 3.1中添加了对此功能的支持 。 我从不喜欢旧的方法&am…

三星 原生android,原生Android 4.0 三星GALAXY Nexus评测

前言:北京时间10月19日上午10时,谷歌联合三星在香港举行了一场主题为“Calling all possibilities ”的新品发布会,在发布会上正式推出了搭载最新Android 4.0操作系统的智能手机三星GALAXY Nexus。三星GALAXY Nexus每一代的Nexus都被看做是An…

css类选择器类名覆盖优先级

code <style>.a{background: red;}.b{background: yellow;} </style> <div class"a b">A</div> 渲染效果 最初以为更改元素中class类里面的类名顺序&#xff0c;渲染效果就会根据类名顺序依次渲染code <style>.a{background: red;…

IntelliJ IDEA插件-常用插件

IntelliJ IDEA的插件真的很多&#xff0c;最近的新版集成的插件已经基本够用&#xff0c;下面是收集的一些常用插件&#xff0c;根据需要来安装和测试。如果还是没有找到&#xff0c;那么自己来开发一个。 官网&#xff1a;https://plugins.jetbrains.com/ 插件开发资料&#x…

CMD命令锦集

虽然随着计算机产业的发展&#xff0c;Windows 操作系统的应用越来越广泛&#xff0c;DOS 面临着被淘汰的命运&#xff0c;但是因为它运行安全、稳定&#xff0c;有的用户还在使用&#xff0c;所以一般Windows 的各种版本都与其兼容&#xff0c;用户可以在Windows 系统下运行DO…

在运行时访问工件的Maven和SCM版本

您可以轻松地告诉Maven在JAR清单文件中包含工件的版本及其Git / SVN /…修订版&#xff0c;然后在运行时通过getClass&#xff08;&#xff09;。getPackage访问该信息。 getImplementationVersion&#xff08;&#xff09; 。 &#xff08;所有功劳归功于MarkusKrger和其他同事…

Bootstrap学习笔记01

1、Make Images Mobile Responsive 用处&#xff1a; 使图片适配你的页面宽度。 操作&#xff1a; 给图片添加 .img-responsive class属性。 <img src"/images/cat.jpg" class"img-responsive"> 2、Center Text with Bootstrap 用处&#xff…

linux开机启动nginx

1.从创建文件nginx 位置/etc/init.d/nginx 2.粘贴内容 #!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server #…

您可能不知道的五个高级Java同步器

除了基于每个Java对象具有的锁定位的通用同步外&#xff0c;您还可以使用Java中更复杂的同步器&#xff0c;例如&#xff1a; 信号量 –使用许可的概念表示一个位置中允许的最大线程数。 当使用值1时&#xff0c;其行为类似于同步&#xff0c;也称为二进制信号量。 但是&#…

2017-2018-2 20179216 《网络攻防与实践》 SQL注入攻击

1. SQL语言 结构化查询语言(Structured Query Language)简称SQL&#xff1a;是一种特殊目的的编程语言&#xff0c;是一种数据库查询和程序设计语言&#xff0c;用于存取数据以及查询、更新和管理关系数据库系统&#xff1b;同时也是数据库脚本文件的扩展名。 2. SQL注入 SQL注…

借百度爸爸下蛋的好看搜索框

学习vue时写的一个小demo 虽然实现很简单&#xff0c;但还是推介看看&#xff0c;没什么难点&#xff0c;而且有些东西你可能会用到&#xff01;在线演示demo源码

数据库关系

第1层&#xff1a;高并发、高速查询 memory cached(内存高速缓存数据库)第2层&#xff1a;持久化保存 redis第3层&#xff1a;数据保存1、sql server,mysql,sqlite等关系型数据库2、mongo db 在很大程度上&#xff0c;redis可以替代mongo db&#xff08;持久化、文件保存&#…

web.config详解

<?xml version"1.0"?><!--注意: 除了手动编辑此文件以外&#xff0c;您还可以使用 Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的“网站”->“Asp.Net 配置”选项。设置和注释的完整列表在 machine.config.comments 中&#xff0c;该…

华为智能手表与鸿蒙,不再是大号手环!华为鸿蒙手表来了:要和苹果抢生态?...

5 月 27 日上午&#xff0c;华为终端官方微博官宣&#xff0c;WATCH 3 腕上智慧&#xff0c;一表万象&#xff0c;旗舰归来&#xff0c;将于 6 月 2 日晚 20:00 与 HarmonyOS、MatePad Pro 2 等产品一同发布。依靠手环的超高销量&#xff0c;华为、小米等企业发力&#xff0c;在…

页面重构-让我们的布局自适应

css重构之旅 >前言&#xff1a; 今年我大一,马上就要大二了。从高三毕业暑假到大学的这一年马上过去&#xff0c;马上迎来大二生活.学习前端也有将近一年了。一昧去追求那些视觉的效果和相对高端和新颖的技术&#xff0c;反而忽略了最基础的布局技巧。 回味 2017年3月&am…