http://www.jdon.com/46372
在Ruby on Rails和NodeJS开发者之间曾经引起宗教类的口水战:顺序编程风格 Vs 基于事件编程。目前大部分Web应用包括Ruby on Rails, Java Spring, Django都是使用顺序编程风格。顺序编程是非常简单和可读的,大部分开发者都是以顺序方式思考,喜欢将一个应用逻辑划分为顺序的时序步骤。顺序编程通常会导致堵塞I/O,因为线程是遵循先来后到的多任务方式,而不是一种协作式的多任务方式,而非堵塞I/O能够带来更好地扩展性和性能。
这是一篇有关Node.js的非堵塞reactive编程案例,文章以一个简单的根据id查询的RESTful案例为例,从堵塞IO谈到回调函数的使用,然后谈论如何在代码可扩展性和可读性之间取得平衡,引入Promise与Fibers编程。大意翻译如下:
下面代码是根据facebook的id查询用户事件数据的实现,顺序编程代码风格是如下(JS伪代码):
function getUserEvents(request,response){ var facebook_id = request.param('facebook_id'); try{ var user = db.users.findOne({fb_id:facebook_id}); var events = db.events.find({user_id:user.id}); response.write(events); }catch(err){ response.status(500).send(err); } } |
顺序编程通常会导致堵塞I/O,因为线程是遵循先来后到的多任务方式,而不是一种协作式的多任务方式。
下面我们逐步引入异步来提升这段代码。
基于回调的解决方案
为了解决堵塞的I/O问题,代码可以被划分为三个部分:
1. 在进行网络或IO调用前的过程处理。
2.网络或IO调用。
3.从网络或IO调用中得到返回数据的处理。
上面这三步都是分离执行的,然后它们在NodeJS的事件循环中被触发执行。
function getUserEvents(request,response){ var returnEvents = function(err,events){ if (err) respone.status(500).send(err);; response.write(events); }); var givenUserFindAndReturnEvents = function(err,user){ if (err) respone.status(500).send(err);; db.events.find({user_id:user.id},returnEvents); }; var findUserAndReturnEvents = function(){ var facebook_id = request.param('facebook_id'); db.users.findOne({fb_id:facebook_id}, givenUserFindAndReturnEvents); } findUserAndReturnEvents(); } |
注意到请求和响应并没有被传递到子函数中,但是子函数可以访问request 和response,因为子函数是一个javascript 闭包. (当调用findUserAndReturnEvents函数时,相当于findUserAndReturnEvents -> givenUserFindAndReturnEvents ->returnEvents 这样一个流式调用)
这三个子函数都是异步执行的, givenUserFindAndReturnEvents 和 returnEvents是在findUserAndReturnEvents回调函数中触发执行的。
这三个子函数执行方式可以使用嵌套的lambda函数风格或findUserAndReturnEvents. givenUserFindAndReturnEvents.returnEvents 这种in-line方式。
这段代码有几个特点:
1.代码分离成网络调用前与网络调用后两个阶段
2.子函数调用者为了完成子函数任务必须传递一个回调函数。
3.顺序逻辑被表达成异步了
4.异步代码更加可扩展伸缩,但是也许增加响应延迟。
5.但是回调会引起可读性的问题:回调地狱 callback hell.
6.跟踪执行流程是困难的,因此称为意大利面条代码spaghetti-code.
7.非堵塞的API可能会限制妨碍你组织你的代码,有侵入性。
8.函数是有层次的。
基于Promise的解决方案
为了解决回调地狱,我们使用代码结构库如q promise. Promise库提供一些标准的代码风格和结构,使得代码更加易读。
var loadEventsForUser = function(err,user){ return db.events.find({user_id:user.id}); }; var findUser = function(){ var facebook_id = request.param('facebook_id'); return db.users.findOne({fb_id:facebook_id}); } function getUserEvents(request,response){ var success = function(events){ response.write(events); }; var error = function(err){ response.status(500).send(err); }; findUser() .then(loadEventsForUser) .then(success) .fail(error); } |
相关推荐
It covers the Node.js ecosystem and its philosophy, a short introduction to Node.js version 6, ES2015, and the reactor pattern. Chapter 2, Node.js Essential Patterns, introduces the first steps ...
他还是其他 4 本 JavaScript 和 Node.js 图书的作者,包括亚马逊上客户端服务器类的畅销书:Rapid Prototyping with JS: Agile JavaScript Development。 Azat 是开源 Node.js 项目:ExpressWorks、mongoui、...
基于Reactor框架的C++服务器项目.zip基于Reactor框架的C++服务器项目.zip基于Reactor框架的C++服务器项目.zip基于Reactor框架的C++服务器项目.zip基于Reactor框架的C++服务器项目.zip基于Reactor框架的C++服务器项目...
Eziriz.Net.Reactor.Cracked(最新版附带操作流程图),最新版,本人亲测有效,exe代码程序成功混淆
.NET Reactor [5.9.2.0] - 2018年9月12日 ------------------------------------- 重建保护引擎以支持更多框架 添加了NET Core保护支持 添加了NET Standard 1.6 / 2.0保护支持 为MAC OSX(Eto.Forms)保护支持添加了...
Eziriz.Net.Reactor.v4.9.0.0.Cracked.by.yoza[UpK] Software name : .Net.Reactor Version : 4.9.0.0 Last Update : 5 June 2014 - 7:18 AM OS : WinALL Developers : Eziriz Web-site : ...
赠送jar包:reactor-core-3.4.10.jar; 赠送原API文档:reactor-core-3.4.10-javadoc.jar; 赠送源代码:reactor-core-3.4.10-sources.jar; 赠送Maven依赖信息文件:reactor-core-3.4.10.pom; 包含翻译后的API文档...
ACE proactor 与 Reactor 模式的详解
基于node.js、vue、mongodb等技术构建的web系统,界面美观,功能齐全,适合用作毕业设计、课程设计作业等,项目均经过测试,可快速部署运行! 基于node.js、vue、mongodb等技术构建的web系统,界面美观,功能齐全,...
Reactor.js ,Reactor 是一个轻量级的实现 reactive programming 的 JavaScrip...
Eziriz.Net.Reactor.4.9.7.0.rar 破解版
赠送jar包:reactor-extra-3.4.5.jar; 赠送原API文档:reactor-extra-3.4.5-javadoc.jar; 赠送源代码:reactor-extra-3.4.5-sources.jar; 赠送Maven依赖信息文件:reactor-extra-3.4.5.pom; 包含翻译后的API文档...
.NET Reactor是一款方便易用的.net混淆器。该软件安全可靠、简单易用,主要用来帮助开发人员保护他们的 .NET 软件产品. 在破解者和您的 .NET 代码之间构建了强大的防破解保护.
赠送jar包:reactor-core-3.4.14.jar; 赠送原API文档:reactor-core-3.4.14-javadoc.jar; 赠送源代码:reactor-core-3.4.14-sources.jar; 赠送Maven依赖信息文件:reactor-core-3.4.14.pom; 包含翻译后的API文档...
linux网络编程框架(C++)基于Reactor事件机制,支持线程池,异步非阻塞,高并发,高性能。linux C++ 基于Reactor事件机制的网络编程框架源码.zip。linux网络编程框架(C++)基于Reactor事件机制,支持线程池,异步...
Eziriz.NET.Reactor.v4.8.0.0。
NET.Reactor.v.4.3.1.0
Eziriz.NET.Reactor.v5.9.8.0.Cracked win10亲测可用win10亲测可用
Net.Reactor.4.9.7.0加密混淆工具。
Software name : .Net.Reactor Version : 4.9.0.0 Last Update : 5 June 2014 - 7:18 AM OS : WinALL Developers : Eziriz Web-site : http://www.eziriz.com/ Change Logs : See "NET Reactor Changelogs.txt" MD5...