在NodeJS中使用流程控制工具Async

Async的内容分为三部分:

  • 流程控制:简化十种常见流程的处理
  • 集合处理:如何使用异步操作处理集合中的数据
  • 工具类:几个常用的工具类

本文介绍其中最简单最常用的流程控制部分。
由于nodejs是异步编程模型,有一些在同步编程中很容易做到的事情,现在却变得很麻烦。Async的流程控制就是为了简化这些操作。

安装

npm install async --save -d

1.async.waterfall实例(多个函数依次执行,且前一个的输出为后一个的输入)

这个函数名为waterfall(瀑布),可以想像瀑布从上到下,按顺序依次执行多个函数。不同之处,每一个函数产生的值,都将传给下一个函数。如果中途出错,后面的函数将不会被执行。错误信息以及之前产生的结果,将传给waterfall最终的callback。
注意,该函数不支持json格式的tasks。

应用场景:在创建课程的接口中,首先解析表单和上传头像,然后保存课程到数据库
async.waterfall([    function(cb) {     util.formParse(req,function(err,result){  //from解析              cb(err,result);          });      },    function(user, cb) {        courseCtrl.create(course,function(err,result){ //保存到数据库            cb(err,result);        })    }], function (err, result) {    if(err) throw  err;    var results = util.response.regOK;    results.item = result;    res.send(results);});

2.async.parallel 实例(多个函数并行执行)

并行执行多个函数,每个函数都是立即执行,不需要等待其它函数先执行。传给最终callback的数组中的数据按照tasks中声明的顺序,而不是执行完成的顺序。
如果某个函数出错,则立刻将err和已经执行完的函数的结果值传给parallel最终的callback。其它未执行完的函数的值不会传到最终数据,但要占个位置。
支持json形式的tasks,其最终callback的结果也为json形式。

应用场景:在获取课程列表接口中,要获取课程列表,同时获取课程数目
async.parallel({     count:function(cb){         courseController.count( req.query ,cb);   //课程数目     },     list:function(cb){         courseController.getList( req.query ,cb);   //课程列表     } },function(err,results){     res.send(results); });
请求结果
{count:2,list:[         {            courseid:xxx,            name:xxx         },         {            courseid:xxx,            name:xxx         }     ]}

3.async.auto实例(多个函数有依赖关系,有的并行执行,有的依次执行)

用来处理有依赖关系的多个任务的执行。比如某些任务之间彼此独立,可以并行执行;但某些任务依赖于其它某些任务,只能等那些任务完成后才能执行。虽然我们可以使用async.parallel和async.series结合起来实现该功能,但如果任务之间关系复杂,则代码会相当复杂,以后如果想添加一个新任务,也会很麻烦。这时使用async.auto,则会事半功倍。
如果有任务中途出错,则会把该错误传给最终callback,所有任务(包括已经执行完的)产生的数据将被忽略。

应用场景:

根据uid(用户id)和course_id(课程id)获取用户信息和用户收藏的视频:
根据uid,在user表中获取用户信息;
根据course_id,在course表中获取课程信息,含teacher_id;
根据teacher_id,在user表中获取讲师信息(上一步执行完,才能执行);
最后,返回userInfo,courseInfo,tearcherInfo;

async.auto({    userInfo:function(cb){            userCtrl.getInfo({uid:req.query.uid}, function (err, result) {   //用户信息            cb(err,result);        });    },    couseInfo:function(cb){        courseCtrl.getInfo(req.query.courseid, function (err, result) {  //课程信息            cb(err,result);        });    },    tearcherInfo:[‘couseInfo‘, function(results,cb) {        userCtrl.getInfo({uid:results.couseInfo.teacherid},function(err,result){  //讲师信息            cb(err,result);        });    }]},function(err,results){    if (err) throw err;    res.send(results);});
请求结果
{userInfo:{    uid:xxx,    name:xxx    },courseInfo:{    courseid:xxx,    name:xxx    },tearcherInfo:{    uid:xxx,    name:xxx    }}
时间: 2024-10-10 15:18:56

在NodeJS中使用流程控制工具Async的相关文章

PHP中的流程控制

PHP中的流程控制: 任何PHP脚本都是由一系列的语句构成.一条语句可以是一个赋值语句,一个函数调用,一个循环,一个条件语句或者甚至是一个什么也不做的语句(空语句).语句通常以分号结束.此外还可以用花括号将一组语句封装成一个语句组.语句本省可以当作是一行语句. if语句 if结构是很多语言包括php在内最重要的特性之一,他允许按照条件执行代码片段.php的if结构和C语言相似: <?phpif($a > $b) echo"a is bigger than b"; ?>

第04章 程序设计中的流程控制

/**第四章 程序设计中的流程控制 @选择语句 形式一:if(条件表达式) 单条语句; 形式二:if(条件表达式){ 语句体;} 形式三:if(条件表达式){ 语句体;}else{ 语句体;} 形式四:if(条件表达式){ 语句体;}else if{ 语句体;} 形式五:if(条件表达式){ 语句体;}else if{ 语句体;}else{ 语句体;}=========================================================================

Java中的流程控制(三)

关于Java中的流程控制 关于Java中的流程控制 4.do while语句 do while语句的功能和while语句差不多,只不过它是在执行完第一次循环后才检测条件表达式的值,这意味着包含在大括号中的程序段至少要被执行一次. do{ 执行语句}while(条件表达式语句); 例子: int x=1;do{System.out.println("x="+x);x++}while(x<3); 程序打印结果如下: x=1x=2 注:do while不管如何都是至少执行一次 5.fo

swift中的流程控制

[转自]http://www.cnblogs.com/wendingding/p/3885108.html 一.swift中的流程控制 Swift支持的流程结构如下: 循环结构:for.for-in.while.do-while 选择结构:if.switch 注意:这些语句后面一定要跟上大括号{},在C语言中不是必须的 说明:跟C语言对比,用法基本一样的有:for.while.do-while.if 因此,只需要关注for-in和switch即可 二.for-in结构 简单使用: for-in和

java中的流程控制

流程控制 顺序执行流程 条件分支流程 if(布尔表达式) {} if(布尔表达式) {} else{} if(表达式1){} else if(表达式2){} else if ... else{} switch(int型表达式或变量) // byte short int char string(1.7之后) { case 值1: case 值2: case 值3: ... default: } break:跳出switch结构 从JDK7.0开始,switch表达式允许采用String 循环流程

异步流程控制之Async模块

一.Async模块介绍 Async是一个使用比较广泛的JavaScript异步流程控制模块,除了可以在Node.js上运行,还可以在浏览器端运行. Async模块提供了约20多个实用的函数来帮助我们理清在实用Node.js过程中各种复杂的回调. 二.Async函数介绍 Async的内容分为三部分: 流程控制(Control Flow):简化十种常见流程的处理 集合处理(Collections):如何使用异步操作处理集合中的数据 工具类(Utils):几个常用的工具类 1). 集合: Collec

Java中的流程控制(二)

关于Java程序的流程控制(二) 关于Java程序的流程控制(二) 3.switch选择语句 switch语句用于将一个表达式的值同许多其他值比较,并按比较结果选择下面该执行哪些语句. switch(表达式){case 取值1: 语句块1 break;--case 取值n: 语句块n break; default: 语句块n+1 break;} 例子:将1~3对应的星期几的英文单词打印出来, int x=2;switch(x){ case 1: System.out.println("Monda

Java中的流程控制(一)

程序的流程控制(一) 关于Java程序的流程控制(一) 从结构化程序设计角度出发,程序有三种结构: 顺序结构 选择结构 循环结构 1.顺序结构 就是程序从上到下一行行执行,中间没有判断和跳转. 2.if条件语句 ① if(条件语句){ 执行语句块} 其中条件语句可以是任何一种逻辑表达式,如果条件语句返回结果为true,则先执行后面大括号对中的执行语句,再顺序执行后面的其他程序代码,反之程序跳过条件语句后面的大括号对中的执行语句. 注:如果大括号中只有一条语句,也可以省略这对大括号 如: int

C中的流程控制

一. 流程控制 l 顺序结构:默认的流程结构.按照书写顺序执行每一条语句. l 选择结构:对给定的条件进行判断,再根据判断结果来决定执行哪一段代码. l 循环结构:在给定条件成立的情况下,反复执行某一段代码. 二. 选择结构-if 1. 简单使用 l if (表达式)  语句1; u if(count>50)  开班;  上课; l if(表达式)  语句1;  else 语句2; u f(count>50)  开班;  else 不开班; l if(表达式)  {  } u if(count