深入浅出NodeJS——异步编程

函数式编程

Javascript中函数作为一等公民,函数看成普通对象,可以作为参数或者返回值。

高阶函数:函数作为参数或者将函数作为返回值的函数

异步编程优势

基于事件驱动的非阻塞I/O模型

异步编程难点

(1) 异常处理,通常try/catch不一定适用,因为callback并不是在当前Tick中执行。

Node在异常处理中约定将异常作为回调函数的第一个实参传回。

(2)  函数嵌套过深

(3) 代码阻塞:没有sleep函数,通过setInterval()和setTimeout()模拟

(4) 多线程编程

(5) 异步转同步

异步编程解决方案

(1) 事件发布、订阅模式

Node自身提供events模块,是发布/订阅模式的简单实现,部分模块继承自它,不同于DOM的事件模型不存在冒泡。

addLinstener/on/once 注册事件

removeListener/removeAllListeners  删除事件

emit() 触发事件

事件发布/订阅模式自身并无同步和异步调用的问题,在Node中,emit()调用多半是伴随事件循环而异步触发。

a. 默认Node中若对一个事件添加超过了10个侦听器,将会得到一个警告

b. 为了处理异常,EventEmittter对象将error对象进行特殊处理,若触发了error事件,EventEmittter会检查是否有error事件监听过监听器,若添加了则错误会交给监听器处理,若外部没有捕获异常,将会引起线程退出。

(2) Promise/Deferred模式

使用事件的方式,执行流程需要被预先设定,即便是分支也需要预先设定,这是由发布/订阅机运行制决定的。

先执行异步调用,延迟传递处理方式,Promise/Deferred模式。

在原始API中,一个事件智能处理一个回调,通过Deferred对象可以对事件加入任意的业务处理逻辑。

(3) 流程控制库

(1) 尾触发与Next

尾触发:需要手工调用才能持续执行后续调用的方法,如connect模块中的next方法

(2) async

https://github.com/caolan/async

异步的串行执行:async.series([fn], fn)

异步的并行执行:async.parallel([fn], fn)

异步调用的依赖处理:async.waterfall

自动依赖处理:async.auto

(3) Step

比async更轻量,只提供一个接口Step,Step(task1,task2,task3)

(4) wind

异步并发控制

异步I/O非常容易实现并发访问,但是底层操作系统并发处理能力也是有限制的,因此需要对并发进行控制。

bagpipe的解决方案

a. 通过一个队列来控制并发量

b. 若当前活跃的异步调用小于限定值,则从队列中取出

c. 若活跃调用达到限定值,调用暂时存放在队列中

d. 每个异步调用结束时,从队列中取出新的异步调用执行

深入浅出NodeJS——异步编程,布布扣,bubuko.com

时间: 2024-12-28 12:57:23

深入浅出NodeJS——异步编程的相关文章

深入浅出NodeJS——网络编程

Node提供丰富的网络编程模块 Node模块 协议 net TCP dgram UDP http HTTP https HTTPS TCP服务 TCP服务事件分为下面两类 (1).服务器事件 对于通过net.createServer()创建的服务器而言,它是一个EventEmitter实例,自定义事件有以下几种: listening:在调用listen()绑定端口或Domain Socket后触发,简写为server.listen(port, listener),通过第二个参数传入. conne

深入浅出NodeJS——异步I/O

底层操作系统,异步通过信号量.消息等方式有着广泛的应用. PHP语言从头到尾都是以同步阻塞方式运行,利于程序员顺序编写业务逻辑. 异步I/O.事件驱动.单线程构成Node的基调. why异步I/O (1).用户体验 在Web2.0中Ajax广泛应用异步刷新机制可以更好的提高用户体验,消除UI阻塞.后端同样采用异步I/O可以有效较少同时请求多个资源的效应时间其为max(M,N). (2).资源分配 多任务主流方式: a. 单线程异步I/O b. 多线程并行 多线程的代价在于创建线程和执行期线程上下

NodeJS的异步编程风格

NodeJS的异步编程风格 http://www.infoq.com/cn/news/2011/09/nodejs-async-code NodeJS运行环境因其支持Javascript语言和异步编程受到开发社区越来越多的关注.从GitHub上的访问量来看,NodeJS项目的关注度在最近几个月已经超过了Ruby及RoR.作为一个新鲜的平台,开发人员开始尝试去接触并运用于实际工作中,比如LinkedIn.Yammer.GitHub.淘宝等企业已经在生产环境中部署了NodeJS应用.不过,在学习No

[转载]NodeJS的异步编程风格

NodeJS运行环境因其支持Javascript语言和异步编程受到开发社区越来越多的关注.从GitHub上的访问量来看,NodeJS项目的关注度在最近几个月已经超过了Ruby及RoR.作为一个新鲜的平台,开发人员开始尝试去接触并运用于实际工作中,比如LinkedIn.Yammer.GitHub.淘宝等企业已经在生产环境中部署了NodeJS应用.不过,在学习NodeJS的过程中,从同步编程到异步编程风格的转换是开发人员面临的一个主要问题,我们如何去适应呢?技术社区在讨论这种转变,专家Marc Fa

[NodeJS]Node异步编程基础

零.前言 为什么要用Node? Node把非阻塞IO作为提高应用性能的方式.而在JS中,天生拥有着异步编程机制: 事件机制.同时JS中不存在多进程.这样当你执行相对较慢需要花费时间长的IO操作时并不会阻塞主进程的任务. 在NodeJS中流行两种响应逻辑的管理方式: 回调, 事件监听. 回调通常用来定义一次性响应的逻辑.事件监听器本质上也是一个回调,不同的是它跟事件相互关联. 一.使用回调来处理一次性事件 回调是一个函数,被当做参数传递给异步函数,描述了异步操作完成后要做什么. 案例: 创建一个简

深入浅出nodejs学习笔记——异步编程

高阶函数:与传统函数只能传递或返回规定的数据类型相比,高阶函数可以返回函数,如下: function foo(x){ return function(){ return x; } } 由于高阶函数可以传递函数为参数,因此可以传递不同类型的函数来实现不同的功能,更加灵活 使用偏函数,如果要创建一组函数,比如isFunction,isString等功能类似的函数,如果每个都独自定义会很麻烦,可以使用统一的方式定义,通过参数的传递让这个函数像工厂一样生产类似的函数,代码如下: var isType =

nodejs学习笔记 —— 异步编程解决方案

在js或者node编程中,由于异步的频繁和广度使用,使得回调和嵌套的深度导致编程的体验遇到一些挑战,如果写出优雅和好看的代码,本文主要针对异步编程的主流方案做一些总结 1.事件发布/订阅模式 事件监听器模式是一种广泛用于异步编程的模式, 是回调函数的事件化,又称发布/订阅模式, node自身提供events模块,是该模式的一个简单实现. EventPorxy 2.promise/deferrd模式 在2009年被Kris Zyp抽象为一个提议草案,发布在CommonJS规范中, 目前,Commo

Node.js学习笔记【3】NodeJS基础、代码的组织和部署、文件操作、网络操作、进程管理、异步编程

一.表 学生表 CREATE TABLE `t_student` ( `stuNum` int(11) NOT NULL auto_increment, `stuName` varchar(20) default NULL, `birthday` date default NULL, PRIMARY KEY  (`stuNum`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 学生分数表 CREATE TABLE `t_stu_score` ( `id` int(11

深入浅出Nodejs读书笔记(转)

原文来自我的博客:http://tw93.github.io/2015-03-01/shen-ru-qian-chu-nodejs-reading-mind-map.html 今天终于把朴灵老师写的<深入浅出Node.js>给学习完了, 这本书不是一本简单的Node入门书籍,它没有停留在Node介绍或者框架.库的使用层面上,而是从不同的视角来揭示Node自己内在的特点和结构.建议有一定Node基础或者做过Node方面的小项目的同学阅读,看完以后你的思维会有很奇特的碰撞,我看的时候就常常会有这样