首页 > Java教程

nodejs进阶—async异步流程控制

2017-01-10 00:08:04

Async介绍

Async是一个流程控制工具包,提供了直接而强大的异步功能。基于Javascript为Node.js设计,同时也可以直接在浏览器中使用。

Async提供了大约20个函数,包括常用的 map, reduce, filter, forEach 等,异步流程控制模式包括,串行(series),并行(parallel),瀑布(waterfall)等。 

项目地址:https://github.com/caolan/async 

Async安装

npm install async(npm是随同NodeJS一起安装的包管理工具)

Async函数介绍

async主要实现了三个部分的流程控制功能:

1). 集合: Collections

2). 流程控制: Control Flow

3). 工具类: Utils

以上所有函数需要配合例子才能深入理解,可前往github网站下载demo:https://github.com/bsspirit/async_demo

每个函数的用法,有非常详细的实例,相信通过例子你会更好的理解流程控制!

对数据库的连续操作

下面我们通过一个实际工作中会遇到的一个场景来具体讲解流程控制: Control Flow这一部分。

假如我们的过程是先从数据库删除记录,删除后再插入一套记录,插入后查询数据库,查询出结果后再更新......具体代码可以看上一篇《nodejs进阶(6)—连接MySQL数据库》在文章最后一段。为了实现了串行操作,所有的调用都是在callback中实现的,5层嵌套结构。这种代码已经变得不可以维护了。所以,需要用async库,对上面的代码结构进行重写!

 1 var OptPool = require('./models/mysqlPool');  2 var async = require('async'); 3 var optPool = new OptPool();  4 var pool = optPool.getPool();  5 var sqls = { 6   'insertSQL': 'insert into user(name) values("conan"),("fens.me")', 7   'selectSQL': 'select * from user limit 10', 8   'deleteSQL': 'delete from user', 9   'updateSQL': 'update user set name="conan update" where name="conan"'10 };11 12 var tasks = ['deleteSQL', 'insertSQL', 'selectSQL', 'updateSQL', 'selectSQL'];13 14 pool.getConnection(function(err,conn){ 15   async.eachSeries(tasks, function (item, callback) {16     console.log(item + " ==> " + sqls[item]);17     conn.query(sqls[item], function (err, res) {18       console.log(res);19       callback(err, res);20     });21   }, function (err) {22     console.log("err: " + err);23   });24 })

运行结果:

虽然跟上一篇博文中《nodejs进阶(6)—连接MySQL数据库》实现的功能是一样的,但代码的可读性就增强了许多倍,这就是高效的开发。