Node.js async
一只大加号 人气:0前言
前面我们介绍了异步模块的CPS解决嵌套回调的方法,但是随着业务的推进,node的更新方法也越来越快,对于异步的处理会有更多的新的方法来解决,最常见的当然是async模块来解决异步请求,这一节就来记录一下async模块的应用,对异步的处理更进一步台阶
async
async不同于ES2017的新特性,这里的async表示的是node的第三方模块,也是一个比较出名的第三方模块,为了解决异步嵌套的回调地狱的问题,我们可以根据不同的业务场景来使用不同的方法,如常见的series、map、parallel,我们来看一下各个方法是如何使用的
series
const async = require('async'); const fs = require('fs'); function read_a(callback){ fs.readFile("./async/a.txt",function(err,data){ if(err){ callback(err); }else{ callback(null,data); } }) } function read_b(callback){ fs.readFile("./async/b.txt",function(err,data){ if(err){ callback(err); }else{ callback(null,data); } }) } function read_c(callback){ fs.readFile("./async/c.txt",function(err,data){ if(err){ callback(err); }else{ callback(null,data); } }) } async.series([read_a,read_b,read_c],function(err,data){ console.log(data.toString);//aaa,bbb,ccc })
series接受数组和回调函数,将异步方法放到一个数组中,回调函数会将全部的异步操作结果返回,顺序和数组中的顺序是一致的,series只是嵌套回调的语法糖,即执行一个操作再进行下一个操作,打印的结果是aaa,bbb,ccc
由于async是第三方模块,所以在使用async的时候也需要像引入fs一样将async模块引入
如果引入之后会发出一下报错,我们可以在终端运行一下npm install async 再重新安装一下,这里我已经亲测并且解决了。
parallel
parallel 的调用也是会按照顺序返回结果,但是与其他方法不同的是异步方法中执行步骤是并行执行的,
执行的时间油耗时最长的决定
,parallel的结果是由所有异步操作完成之后组装成顺序的结果返回出来
waterfall
waterfall可以用来处理多个连续的回调:
const async = require('async'); const fs = require('fs'); function read_a(callback){ fs.readFile("./async/a.txt",callback) } function read_b(value,callback){ console.log('last_value',value.toString()); fs.readFile("./async/b.txt",callback) } function read_c(value,callback){ console.log('last_value',value.toString()); fs.readFile("./async/c.txt",callback) } async.waterfall([read_a,read_b,read_c],function(err,data){ console.log(data.toString()); //last_value aaa //last_value bbb //ccc })
我们分别调用了abc三个文件,三个文件的结果都在第二个异步中返回出来,这个方法运用起来更像是回调的嵌套使用。
map
对于上面几个方法中将方法合并成一个数据,map的方法比较特别,接收的一个数组是按照参数合并的,map接收三个参数,分别是数组,异步方法,回调
如果想简单的使用map方法,那么将不需要做额外的封装,可以直接使用readFile方法
let arr = ['./async/a.txt','./async/b.txt','./async/c.txt'] async.map(arr,fs.readFile,function(err,results){ console.log(results); })
如果对异步方法想要传参使用的话,可以对异步方法来进行一个简单的封装:
const async = require('async'); const fs = require('fs'); function read(path,callBack){ fs.readFile(path,"utf-8",callBack) } let arr = ['./async/a.txt','./async/b.txt','./async/c.txt'] async.map(arr,read,function(err,results){ console.log(results);//[ 'aaa', 'bbb', 'ccc' ] })
async并不是使用所有场合,可以明显的看出,如果现在需要在上一个方法的结果来确定是否调用下一个异步方法,这个方法就显得很不适用,下一节再来介绍一下Promise的使用。
加载全部内容