当前位置: 首页 > 后端技术 > Node.js

Nodejs异步流程框架简介async

时间:2023-04-03 20:17:17 Node.js

Async:Async是一个流程控制工具包,提供了直接而强大的异步功能。基于Javascript为Node.js设计,也可以直接在浏览器中使用。Async提供了大约20个函数,包括常用的map、reduce、filter、forEach等。异步流控方式包括串行(series)、并行(parallel)、瀑布(waterfall)等。https://github.com/caolan/async我们常用的有以下四种:serial,unassociated,serial,associated,parallel,unassociated,intelligentcontrol1.async.series:serial,unassociated:多个函数或方法依次执行,但它们之间没有任何联系,只是顺序,比如我要写一个文件,写完了给用户发邮件,这两者没有必然联系,但是写完文件一定要发邮件。async中有一个方法系列可以实现这个过程。代码实现如下:varasync=require('async');console.time('series');async.series({one:function(callback){callback(null,'one');//callback('iamerr','one');异常处理},two:function(callback){callback(null,'two');},},function(error,result){//最终结果console.log('error:'+error);console.log('result:'+result);console.timeEnd('series');});//error:null//result:[objectObject]//series:4.472ms2.async.waterfall:系列有关联的瀑布函数,数组中的每个函数串行执行,最后执行回调。语法:async.waterfall(tasks,callback)第一个参数tasks是一个数组,里面包含了需要顺序执行的函数。第二个参数是回调函数。当瀑布函数(即tasks数组中的函数)执行出错时,会执行回调函数,返回错误信息。当瀑布流函数没有错误时,会在tasks数组中执行。此回调函数在包含的函数之后执行。用法示例:一般用法:async.waterfall([myFirstFun,mySecondFun,myLastFun],function(err,result){//结果回调函数//result相当于任务数组中最后一个函数(myLastFun)的返回值doneconsole.log(result);//myLastFun})functionmyFirstFun(callback){callback(null,'one','two');}functionmySecondFun(arg1,arg2,callback){//arg1等价于'one',arg2相当于'two'callback(null,'three');}functionmyLastFun(arg1,callback){//arg1相当于'three'callback(null,'done');}3.async。parallel:Parallelisnotassociated任务并行运行一组函数,而不等待前一个函数完成。如果任何函数发生错误,回调函数将立即执行并返回错误信息;如果没有错误发生,将使用返回函数返回所有任务函数执行后的结果。语法:async.parallel(tasks,callback)代码示例:async.parallel([function(callback){setTimeout(function(){callback(null,'one');},200);},function(callback){setTimeout(function(){callback(null,'two');},100);}],function(err,results){console.log(result)});4.async.auto:智能控制高于一切纯串行传输是并行的,但是当一个场景需要使用串行和并行时,虽然可以通过单独写来解决,但是效率不是很高,可维护性也不是很好.自动可以解决这个问题。如下场景:从某处获取数据,在硬盘上新建一个目录,将数据写入目录下的一个文件,发送邮件,将文件作为附件发送给他人。可以知道,1和2可以并行执行,3需要等待1和2完成,4需要等待3完成。使用auto来解决varasync=require('async');console.time('auto');async.auto({getData:function(callback){setTimeout(function(){console.log('1.1:gotdata');callback(null,'mydata');},300);},makeFolder:function(callback){setTimeout(function(){console.log('1.1:madefolder');callback(null,'myfolder');},200);},writeFile:['getData','makeFolder',function(callback){setTimeout(function(){console.log('1.1:写入文件');callback(null,'myfile');},300);}],emailFiles:['writeFile',function(callback,results){console.log('emailedfile:',results.writeFile);callback(null,results.writeFile);}]},function(err,results){console.log('err:',err);console.log('results:',results);console.timeEnd('auto');});结果如下1.1:制作文件夹1.1:获得数据1.1:写入文件电子邮件文件:myfileerr:nullresults:{makeFolder:'myfolder',getData:'mydata',writeFile:'myfile',emailFiles:'myfile'}auto:650.972ms