前言
async
series
parallel
waterfall
map
前言前面我们介绍了异步模块的CPS解决嵌套回调的方法,但是随着业务的推进,node的更新方法也越来越快,对于异步的处理会有更多的新的方法来解决,最常见的当然是async模块来解决异步请求,这一节就来记录一下async模块的应用,对异步的处理更进一步台阶
asyncseriesasync不同于ES2017的新特性,这里的async表示的是node的第三方模块,也是一个比较出名的第三方模块,为了解决异步嵌套的回调地狱的问题,我们可以根据不同的业务场景来使用不同的方法,如常见的series、map、parallel,我们来看一下各个方法是如何使用的
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 再重新安装一下,这里我已经亲测并且解决了。
parallelwaterfallparallel 的调用也是会按照顺序返回结果,但是与其他方法不同的是异步方法中执行步骤是并行执行的,
执行的时间油耗时最长的决定
,parallel的结果是由所有异步操作完成之后组装成顺序的结果返回出来
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的使用。
到此这篇关于Node.js入门笔记 之async模块的文章就介绍到这了,更多相关Node.js async 内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!