使用 async Node.js 简化Javascript代码

async Node.js

async 是Javascript的扩展库。它可以简化Node.js异步操作的书写,使代码更容易被读懂,而不是面对多层的括号发疯。

我们可以使用Node.js的包管理器npm直接安装它,在shell中输入:

1

2

npm install async

或者 更改package.json:

1

2

3

4

5

6

7

8

9

10

11

12

13

{

"name": "application-name",

"version": "0.0.1",

"private": true,

"scripts": {

"start": "node ./bin/www"

},

"dependencies": {

......

"async":"~0.9.0"

}

}

然后运行 npm install. 安装完成后,在需要使用它的文件中加入:

1

2

var async = require(‘async‘);

series

使用series可以简化流程运行的异步函数。
现在构想一个这样的场景:
我需要执行一组动作,喝水 -> 吃饭 -> 打开电脑

通常的代码编写应该这样:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

function normalFunc() {

console.log("Normal function Run");

drinkWater(function (error,data) {

if(error) {

console.log("error: ",error,"msg: ",data);

} else {

console.log("drink water finish, I will eat food");

eatFood(function(error,data) {

if(error) {

console.log("error: ",error,"msg: ",data);

} else {

console.log("eat food finish, I will open mac");

openMac(function(error,data) {

if(error) {

console.log("error: ",error,"msg: ",data);

} else {

//do something after open mac

console.log("Mac is open, all action done");

}

});

}

});

}

});

}

当异步调用超过两次嵌套,代码会变得不直观。使用async.series可以优化:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

function seriesFunc() {

async.series([

function(callback) {

console.log("Series function Run");

drinkWater(function(error,data) {

callback(error,data);

});

},

function(callback) {

console.log("drink water finish, I will eat food");

eatFood(function(error,data) {

callback(error,data);

});

},

function(callback) {

console.log("eat food finish, I will open mac");

openMac(function(error,data) {

callback(error,data);

});

}],

function(error,result) {

if(error) {

console.log("error: ",error,"msg: ",result);

}

else {

console.log("Mac is open, all action done");

}

}

);

}

为了测试这个例子,我编写三个函数:

1

2

3

4

5

6

7

8

9

10

function drinkWater(callback) {

callback(null,null);

}

function eatFood(callback) {

callback(null,null);

}

function openMac(callback) {

callback(null,null);

}

接下来,我们测试这些函数,在console中的显示是下面的代码:

1

2

3

4

5

6

7

8

9

10

Normal function Run

drink water finish, I will eat food

eat food finish, I will open mac

Mac is open, all action done

Series function Run

drink water finish, I will eat food

eat food finish, I will open mac

Mac is open, all action done

这样看,我们达到了相同的效果。我们再测试出错的情况,将openMac函数更改成下面的代码:

1

2

3

4

function openMac(callback) {

callback(1,"I can‘t find my mac");

}

再测试这两个函数:

1

2

3

4

5

6

7

8

9

10

Normal function Run

drink water finish, I will eat food

eat food finish, I will open mac

error:  1 msg:  I can‘t find my mac

Series function Run

drink water finish, I will eat food

eat food finish, I will open mac

error:  1 msg:  [ null, null, ‘I can\‘t find my mac‘ ]

我们能发现 series 的 result是一个数组。series中的callback被执行后,无论动作的结果是成功还是失败,都会在result中添加一个数据。另一方面,我们也可以通过result中元素的数量,判断 series 执行了几个函数。

waterfall

另一个有用函数是 waterfall 。它和 series 一样,可以简化流程运行的异步函数。不同点是它可以在流程执行的过程中传递参数。

例如,我需要在异步函数中返回一些饮品或食物的信息,我需要更改

1

2

3

4

5

6

7

8

9

10

function drinkWater(callback) {

callback(null,"Cola");

}

function eatFood(callback) {

callback(null,"Hamburger");

}

function openMac(callback) {

callback(null,"Chrome");

}

然后添加:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

function waterFunc() {

async.waterfall([

function(callback) {

console.log("Water Fall Run");

drinkWater(function(error,data) {

callback(error,data);

});

},

function(data,callback) {

console.log("drink ",data," finish, I will eat food");

eatFood(function(error,data) {

callback(error,data);

});

},

function(data,callback) {

console.log("eat ",data," finish, I will open mac");

openMac(function(error,data) {

callback(error,data);

});

}],

function(error,result) {

if(error) {

console.log("error: ",error,"msg: ",result);

}

else {

console.log("Mac ",result," is open, all action done");

}

}

);

}

每一次运行函数的回调结果都会传给下一个动作,最后的result与series不同,是最后一次执行动作callback中传递的值。运行测试结果为:

1

2

3

4

5

Water Fall Run

drink  Cola  finish, I will eat food

eat  Hamburger  finish, I will open mac

Mac  Chrome  is open, all action done

然后再来测试出错的情况,更改:

1

2

3

4

function eatFood(callback) {

callback(1,"not enough money");

}

再运行的结果是:

1

2

3

4

Water Fall Run

drink  Cola  finish, I will eat food

error:  1 msg:  not enough money

总结

使用 async node.js 可以将复杂的逻辑表现的更直观。但如果逻辑只有一次回调,就不建议使用async了,我认为这会无意义的增加一些运行的成本。

本文出自: [ 松阳的博客 ] / [ blog.csdn.net/fansongy ] 禁止用于商业用途 转载请注明出处
原文链接: http://www.songyang.net/async-node-js/

时间: 2024-09-28 15:51:23

使用 async Node.js 简化Javascript代码的相关文章

Meteor: 如何复用node.js包或代码

Meteor基于Node.js,但是却有自己的包管理系统(atmosphere)以及代码加载机制,且meteor是非异步的,这些都意味着,node.js包(npm package)和代码通常不能直接用于meteor程序. 这里分享三种方法以在meteor中复用node.js包和代码. meteorhacks:npm + meteorhacks:async npm+async是复用npm包最便捷的方式.meteor程序添加npm包之后,便可以在packages.json中声明包依赖,在程序中通过M

【转】node.exe调试JavaScript代码

node.exe调试JavaScript代码 目的: Console.log可以打印一些信息,光有log还不够,当程序出现问题时通过log可以定位到错误位置,但是当我们想查看错误现场的变量时,log就无能为力了,一般情况下我们不会把所有的变量都打印出来.此时就需要断点的功能了,在程序里边打上断点,直接定位到错误位置,分析错误现场确认错误原因. 三种模式: nodejs内部提供一个debug机制,可以让程序进入debug模式,供开发者一步一步分析代码发现问题. 共有3中启动参数可以让程序进入deb

用Sublime Text 3的HTML-CSS-JS Prettify(需安装node.js)插件格式化代码

用Sublime Text 3的HTML-CSS-JS Prettify(需安装node.js)插件格式化代码 用 Sublime Text 格式化代码(安装 HTML-CSS-JS Prettify 插件)时,格式化时却会提示(默认路径未找到Node.js) 下载安装到Node.js 官网下载 32位版本(据说win x64版有问题)安装. 确认Node.js安装路径鼠标右键HTML/CSS/JS Prettify > Set Plugin Options保证插件路径与Node.js安装路径一

Node.js调用C#代码

在Node.js的项目中假如我们想去调用已经用C#写的dll库该怎么办呢?在这种情况下Edge.js是一个不错的选择,Edge.js是一款在GitHub上开源的技术,它允许Node.js和.NET core在同一个进程内相互调用,并且支持Windows,MacOS和Linux.本地可以通过npm直接安装Edge.js,地址:https://www.npmjs.com/package/edge#windows,上面有关于它的详细介绍,里面有好多的使用情况,下文主要简单介绍其中的一种使用方法来让No

使用Chrome DevTools直接调试Node.js与JavaScript(并行)

Good News: 现在我们可以用浏览器调试node.js了!!! 前提 Node.js 6.3+, 这个可上Node.js官网自行下载: Chrome 55+. 如果您本地的chrome升级到最新版后还是<55, 可以从此处下载:Chrome Canary,亲测可行. 配置 就目前来说,在浏览器端并行调试JavaScript与Node.js还属于新特性,新体验.为了能够正常使用,你还需要做如下配置: 输入url:chrome://flags/#enable-devtools-experime

JS Nice – JavaScript 代码美化和格式化工具

JS Nice 是一款让经过混淆处理的 JavaScript 代码可读更好的工具.它使用一种新型的用于 JavaScript 代码美化的去混淆和去压缩引擎.JSNice 采用先进的机器学习和程序分析技术,从可用的开源项目学习命名和类型规律. 不错,去看看

Node.js热部署代码,实现修改代码后自动重启服务方便实时调试

写PHP等脚本语言的时候,已经习惯了修改完代码直接打开浏览器去查看最新的效果.而Node.js 只有在第一次引用时才会去解析脚本文件,以后都会直接访问内存,避免重复载入,这种设计虽然有利于提高性能,却不利于开发调试. 在没有使用第三方工具的情况下,通常修改js文件后需要手动CTRL+C终止程序,再重新启动node服务,这显然是一件很繁琐的事情. 于是就出现了很多第三方的管理工具(例如:supervisor.hotnode.forever.pm2等),当文件修改保存后,它能自动重启node服务,帮

node.js的作用、回调、同步异步代码、事件循环

http://www.nodeclass.com/articles/39274 一.node.js的作用 I/O的意义,(I/O是输入/输出的简写,如:键盘敲入文本,输入,屏幕上看到文本显示输出.鼠标移动,在屏幕上看到鼠标的移动.终端的输入,和看到的输出.等等) node.js想解决的问题,(处理输入,输入,高并发 .如 在线游戏中可能会有上百万个游戏者,则有上百万的输入等等)(node.js适合的范畴:当应用程序需要在网络上发送和接收数据时Node.js最为适合.这可能是第三方的API,联网设

为什么我这个 Java 死忠倒向了 Node.js?

作为一个在Sun微系统公司Java SE团队工作了十多年的人,难道不应该是体内流淌着Java字节码的血.只要一息尚存就要不断实现抽象接口吗?但对于我这个前Java SE团队成员来说,2011年学习了Node.js平台后就像是呼吸到了新鲜空气一样--我在2009年1月被Sun裁退之后(正好在Oracle收购之前),开始学习Node.js并被它深深所吸引. 我是怎样被吸引的?从2010年起,我就开始写各种关于Node.js编程的东西了.具体来说,写了四版<Node.js Web开发>,加上一些其他