流程控制库async

看看npmjs.org里的模块依赖排行榜,async常期排在前三,可见此库确实不错,今天就来简单的说说它的作用



asyncnodejs里的流程控制模块,也可以用在浏览器端,主要是用来控制多个异步调用时的顺序以及依赖,在不用async之前,多个异步调用通常是这样的

fs.readFile('file1', function(){
    fs.readFile('file2', function(){
        fs.readFile('file3', function(){
            //.....
        })
    });
})

当业务比较复杂的时候,异步嵌套将会更深,这样就会形成异步地狱,这样非常不利于代码维护以及业务处理,而且对异常处理也不方便,下面我们来看看用async是怎么解决的,当然这种情况用promise机制来处理也可以,但是今天这里只讲async.

async.series

串行执行多个异步方法,使嵌套调用扁平化

async.series([
function(callback){
    fs.readFile('../data/file.txt', 'utf8', callback);
},
function(callback){
    fs.readFile('../data/file1.txt', 'utf8', callback);
}],
function(err, results){
    if(err) {
        console.log(err)
    }else{
        console.log(results);
    }
});

series允许传递两个参数,第一个参数代表要异步执行的所有函数,后一个参数是当前面所有异步执行完之后执行的一个回调函数,只要有一个异步方法异步,则直接执行回调函数,err参数就是异常信息,当所有的异步方法执行成功之后,回调函数里的result保存的前面所有异步方法执行的结果.

  • 注意代码里的callbackasync自己传递的固定参数不可更改.

series是串行执行的,也就是说当异步方法比较多的时候,其实串行执行的效率并不是很高,假如异步方法之前没有依赖关系的话,完全可以并行执行,下面我们来看看async提供的并行方法

async.parallel

并行执行多个异步方法,并返回多个结果组成的数组

async.parallel([
function(callback){
    fs.readFile('../data/file.txt', 'utf8', callback);
},
function(callback){
    fs.readFile('../data/file1.txt', 'utf8', callback);
}],
function(err, results){
    if(err) {
        console.log(err)
    }else{
        console.log(results);
    }
});

parallel在执行没有依赖关系的异步操作时候,效率还是不错的,回调函数跟上面的series一样,只要有一个异步方法出现异常,则传递异常信息给回调的第一个参数,都成功则results返回包含所有结果的数组.

  • 注意代码里的callbackasync自己传递的固定参数不可更改.

了解了串行和并行的方法之后,有一个问题那就是当后面的异步方法需要前面的异步方法返回的结果作为依赖的时候怎么办呢,async也提供了这样的方法

async.waterfall

前面异步方法返回的结果作为后面异步方法的条件,依次串行执行异步方法,最后返回最后一个异步方法的结果

async.waterfall([
function(callback){
    fs.readFile('../data/file.txt', 'utf8', function(err, content){
        callback(err, content);
    })
},
function(arg1, callback){
    fs.readFile('../data/' + arg1, 'utf8', callback);
}],
function(err, results){
    if(err) {
        console.log(err)
    }else{
        console.log(results);
    }
})

waterfall方法就是用来处理异步方法之间的依赖的,这里跟上面的区别在于callback方法传递了两参数,null,content, 第一个参数代表是否异常;第二个参数代码当前异步方法返回的结果,这个值将会作为下一个异步方法的参数,比如这里的function(arg1, callback) ,arg1参数就是前一个异步方法返回传递的结果,假如后面的异步方法不需要前面的依赖则不用传递这个参数,像上面的第二异步方法那样

  • 注意代码里的callbackasync自己传递的固定参数不可更改.

当异步方法之前的依赖关系从一对一变到一对多了怎么办呢,上面的方法只有处理一对一的关系,一对多的话则不行,下面来看看async提供的超级好用的方法auto

async.auto

智能根据配置文件执行异步方法,支持一对多的情况

var deps = {
    'file': function(callback){
        fs.readFile('../data/file.txt', 'utf8', function(err, content){
            callback(err, content); // => file1.txt
        });
    },
    'file1': function(callback){
        fs.readFile('../data/file2.txt', 'utf8', function(err, content){
            callback(err, content); // => ../data/
        });
    },
    'action': ['file', 'file1', function(callback, result){
        fs.readFile(result.file1 + result.file, 'utf8', function(err, content){
            callback(err, { result: content, xuwm: 'feenan'});
        });
    }]
};

async.auto(deps, function(err, result){
    console.log(result);
});

auto方法会根据异步方法里的依赖关系,保证在依赖方法执行完成之后再去执行异步方法,auto允许传递两个参数,第一个参数是异步方法关系的定义,是一个key-vale方式的键值对,值传递单个函数则表示没有依赖,传递数组的话,数组内前面写上依赖的键值,最后写上异步方法.

  • 注意这里的异步方法会依赖前面异步方法返回的结果,所以callback会传递两参数,异常和结果

总结

其实async还有很多别的功能,本身也提供了很多数组相关的操作,更多信息请看这里async git.

时间: 2024-11-01 18:04:49

流程控制库async的相关文章

深入分析 Node.js 异步流程控制教程

摘要 目前在js流程控制领域越来越乱,各种派系...比如promise,generator,async函数,各种混战,在百花齐放的今天,作为前端或Node.js沾边工程师或全栈工程师,你知道该学哪种么? 从下一代测试框架ava说起 流程控制发展的前世今生概览 从co引出的血案,到yieldable 5种,到aysnc函数,聊聊同步的流程控制 最后推导一下学习重点.未来趋势 个人介绍 i5ting(桑世龙),空弦科技 CTO,StuQ 明星讲师,开源项目 Moajs 作者,Node.js 技术布道

高性能JavaScript 循环语句和流程控制

前言 上一篇探讨了达夫设备对于代码性能的影响,本文主要探讨并且测试各种常见的循环语句的性能以及流程控制中常见的优化. 循环语句 众所周知,常用的循环语句有for.while.do-while以及for-in,forEach.除了for-in和forEach性能略 低外,平时我们对前三者的选择更多的是基于需求而非性能考虑,今天我们就对它们各自的性能做个测试,告诉我们最极端的情况下还能做哪些优化. 首先我们来谈谈为何for-in和forEach会比其他的慢.for-in一般是用在对象属性名的遍历上的

php程序的三大流程控制

php程序的三大流程控制 ① 顺序控制(从上到下,从左到右) ②分支控制 if(条件表达式){ //n多语句 }else if (条件表达式){ //n 多语句 }else if(条件表示式){ //. }//这里可能还有更多的else if else{   } u switch分支语句 基本语法结构 switch(表达式){ case 常量1: //n多语句; break; case 常量2: //n多语句 break; default: //n多语句; break; } u 常量的类型 (i

PHP第五课 自动类型转换与流程控制

学习概要: 1.了解自动类型转换的有哪些 2.了解基本的流程控制语句 3.实例:实现日历表格的写法 自动类型转换 1)整型转字符串 echo $num."abc"; 2)字符串转整型 $str+3; 3)转布尔类型 为假情况 0 "" "0" false array() null 未定义 4)强制类型转换 (int)$str (float)$str (string)$str 5)常量 define("HOST","l

PL/SQL流程控制

  PL/SQL程序中的流程控制语句借鉴了许多高级语言的流程控制思想,但又有自己的特点. 条件控制     下面通过实例介绍条件控制语句的使用.    1. if..then..end if条件控制    采用if..then..end if条件控制的语法结构如图9.15所示.    在[SQLPlus Worksheet]中执行下列PL/SQL程序,该程序判断两个整数变量的大小. 执行结果如图9.16所示.    ―――――――――――――――――――――――――――――――――――――   

SQL 流程控制命令

Transact-SQL 语言使用的流程控制命令与常见的程序设计语言类似主要有以下几种控制命令. 4.6.1 IF-ELSE其语法如下:IF <条件表达式><命令行或程序块>[ELSE [条件表达式]<命令行或程序块>]其中<条件表达式>可以是各种表达式的组合,但表达式的值必须是逻辑值"真"或"假".ELSE子句是可选的,最简单的IF语句没有ELSE子句部分.IF-ELSE用来判断当某一条件成立时执行某段程序,条件不成

php学习之流程控制实现代码

复制代码 代码如下: <?php /* * 流程控制 * * 一.顺序结构 * 二.分支结构--条件结构--选择结构 * 1.单路分支 * //条件bool,true或false,> < == !- & ! * if(条件) * 执行下面一条语句 * if(条件) * { * 代码段; * 代码段; * } * * 2.双路分支 * 使用else从句 * * if(条件) * 执行一条语句 * else * 执行一条语句 * if(条件){ * 一条或多条代码 * }else{

Flash的流程控制与循环控制语句

控制|循环|语句 众所周知,flash中动画依靠的是时间轴,在没有脚本的情况下,动画会依照时间轴从第一帧不停的播放到最后一帧,然后始重复播放或者干脆停止.为了能更好的控制动画,就必须使用脚本语句.而要想使动画具有逻辑判断的功能,就要使用流程控制和循环控制语句了!下面通过几个简单的小例子来学习流程与循环控制语句. 一.流程控制语句 所谓流程控制,无非就是我们想控制动画程序的执行顺序而已.我们可以让flash根据一些特定的条件,来决定要执行哪个程序.这样就好象给了程序一些判断的机制. if...el

[叩响C#之门]第4章 流程控制 4.1 算法的概念(以“人鬼过河”游戏为例)

流程控制 迄今为止,我们所写的程序都是按顺序逐句执行的,但大千世界纷纷复杂,并非所有事情都按直线行进,经常会遇到分去或重复操作,那么怎样用程序实现它们呢?