Nodejs 中的控制流--the Do Style(二)

最近看到一篇关于node中改变异步编程控制流的文章:Control Flow in Node Part II.

翻译如下:(有删减)

当前在Node中,有两种方式可以处理异步返回值问题:“回调”和“事件发射”。这些你都可以在Nodejs官网上了解到。我在这里将谈论另一种管理异步返回[值或流]事件的方式。

回调和事件发射器之间的区别是什么?

回调其实就是一个function,但是用于处理异步的。

fs.readFile()传入一个文件名称作为参数,然后“返回”文件的内容。但它最终并不是真正地返回了文件内容,而是把结果传递给了作为参数的回调函数。

有时你想要监听的事件可能会触发很多次。例如,在一个web服务器中,当处理一个请求时,可能"data"事件会被触发一次或者多次,最后“end”事件才会被触发。

它与回调的不同在于:你要么得到一个结果,要么得到一个错误。对于事件来讲,你永远都不能得到两者,或者超过一种结果(注:这里侧重于表达“事件的触发”,例如要么你就触发一个success事件,要么就触发一个error事件)。所以,如果有超过两个事件,它们可能会被调用很多次,那么你就需要更为强大、灵活的事件发射器。

Node.js 的回调风格

Node最初使用promises代替callback,在经过很多争辩、讨论之后,node决定用简单的callback来取代promise。
在node中,任何异步的函数都接受一个回调来作为它最后一个参数。在fs模块中的大部分函数都是这样。并且,这些回调函数大部分都会以一个error参数(如果有的话),作为其第一个参数。

这里有另一种方式

Promises 工作地很好,但在读了inimino的持续使用后,我备受鼓舞地尝试了一种新的方式。
还记得我们的第一个示例吗?假设fs.readFile被以像下面这种形式来使用:

取代寄期望于一个回调,它返回了一个函数,该函数“期望”两个回调方法:一个用于读取成功之后的处理,另一个用于处理失败。我称之为 Do Style,等一会儿你将会看到为何要这么写。

如果产生该回调风格

我们将编写自定义的函数,让它不是直接返回一个值。用这种新的风格,让我们编写一个看起来类似的函数:fileWrite(假设fs模块里的函数也转换成了这种风格):

注意看,将错误信息链接给我们的调用端是多么容易!同时这段使用的代码也更加简短并且易于阅读。创建这种风格的关键在于:不是产生一个promise并返回,而是返回一个函数,它携带两个回调函数作为参数,然后在需要的时候,直接调用它们。

Do 类库

我今天给出一个很短的类库作为其早期的版本。或者说,它就是一个能够进行并发响应的独立函数。

实现

但在这里合并了所有回调的响应,这在某种程度上能够发挥更为强大的威力以及编写更有趣的代码。

单独处理

让我们假设有个readFile的函数使用了这个技术。下面是它如何使用的:

并行处理

现在,让我们使用Do类库合并那些操作:

它并行完成两个异步操作,当两个操作都完成之后触发回调。注意,在没有产生错误的时候,它只触发成功的那个回调函数,如果有一个错误,它将被传递给一个公共的错误处理器(回调)中去。

当然,你也可以传递一个“预操作的数组”:

//============================写在最后=============================
最后还有一种方式,可读性不敢恭维,如果有想了解的童鞋,请自行异步到原作者博客。这种方式是提供了一种回调的变相风格,简单地使用是可以增强代码的可读性的,不建议过度使用。认为它影响可读性的人,大可不必介意。

原文发布时间为:2013-01-20

本文作者:vinoYang

时间: 2024-09-20 00:22:37

Nodejs 中的控制流--the Do Style(二)的相关文章

NodeJS中的MongoDB快速入门详细教程_node.js

MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 一.MongoDB必须理解的概念 1.数据库:每个数据库都有自己的权限和集合. 2.文档:一个键值对. 3.集合:一组文档,即一组键值对.当第一个文档插入时,集合就会被创建. 二.Mac下的MongoDB安装和启动 1.使用brew进行安装:brew ins

NodeJS中利用Promise来封装异步函数

这篇文章主要介绍了NodeJS中利用Promise来封装异步函数,使用统一的链式API来摆脱多重回调的噩梦,非常的实用的小技能,希望小伙伴们能够喜欢 在写Node.js的过程中,连续的IO操作可能会导致"金字塔噩梦",回调函数的多重嵌套让代码变的难以维护,利用CommonJs的Promise来封装异步函数,使用统一的链式API来摆脱多重回调的噩梦. Node.js提供的非阻塞IO模型允许我们利用回调函数的方式处理IO操作,但是当需要连续的IO操作时,你的回调函数会多重嵌套,代码很不美观

nodejs中async和promise使用上有什么区别?

问题描述 nodejs中async和promise使用上有什么区别? nodejs中async和promise使用上有什么区别?~~~~~~~ 解决方案 async中的callback是指令式的异步 promise是函数式的异步 解决方案二: 支持一下支持一下~~~~~~~~ 解决方案三: Bluebird-NodeJs的Promise

nodejs 中express的问题

问题描述 nodejs 中express的问题 我想express 在scott文件夹下面生成一个如图的模板文件夹.求大神指教是哪里不对劲导致无法使用express 命令.因为在scott下面的require("express")可以调用到express 解决方案 我也遇到了这个问题! 解决方案二: 首先是不是全局安装,如果是用命令进入scott文件夹使用express命令就可以了

在团队开发环境中使用 Visual Studio .NET (二)

脱机时签入文件 不可能在脱机时签入文件:因为您未连接到网络,签入命令未启用.这是故意设置的,这样可以在项目重新联机时方便地查看哪些文件在脱机时被签出. 进入联机状态 这与进入脱机状态基本上相同.若要使解决方案及其项目联机,请在"File"菜单上,单击"Source Control",然后单击"Change Source Control...".显示的对话框与进入脱机状态时相同.选择"Connected"即可使解决方案和项目联机

在IE浏览器中使用Windows窗体控件(二)

window|控件|浏览器 在IE浏览器中使用Windows窗体控件(二) 作者::Thiru Thangarathinam 翻译:秋枫 通过windows窗体控件访问Web Service 窗体控件一个重要优点就是你可以通过它在客户端实现丰富的用户信息.比如说,你可以通过窗体控件对Web服务的访问从而在IE中显示而不需要重新刷新该页面.为了演示这点,我们先来创建一个Web服务,接着再来演示怎样通过窗体控件调用Web服务. 创建Web service 我们创建一个 Visual C# Asp.n

如何在NodeJS中调用SS生成的DLL

要想在NodeJS中调用SS生成的DLL, 需要借助EdgeJS. EdgeJS: http://tjanczuk.github.io/edge/ 如果你还不知道如何在SS 中生成DLL, 请查看: Spider Studio 新版本 (x-mas) - 可以引入第三方程序集, 可以将脚本生成为DLL 下面以曾经写过的XML/JSON互转的脚本为例 (C#中 另辟蹊径解决JSON / XML互转的问题) 说明如何在NodeJS中应用SS DLL: 1. 安装edgejs npm install

SQLServre中的控制流语句

  SQL Server中的控制流语句 SQL Server中的控制流语句: IF-ElSE GOTO WHILE WAITFOR TRY/CATCH CASE 将代买组成块的方法:以begin语句开始,以End语句结束.(可以嵌套) 关于CASE语句: 简单CASE语句: <喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+y9H

浅谈NodeJS中require路径问题

  学习Nodejs也是出于对这个新产物的好奇,而且有两个重要项目也需要他的支持,所以要好好学学这个新语种.在nodejs中,模块大概可以分为核心模块和文件模块.核心模块是被编译成二进制代码,引用的时候只需require表示符即可 项目需要用nodejs,感觉nodejs是前端装逼神器了,是通向全栈工程师的必经之路哇,接下来开始踏上学习nodejs的征程.下面是第一个hello,world的程序. 1.server.js文件,这相当于服务器脚本. ? 1 2 3 4 5 6 7 8 9 10 1