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

ES6系列异步处理实践

时间:2023-04-03 10:44:28 Node.js

前言下面我们以查找指定目录下的最大文件为例,感受从回调函数->Promise->Generator->Async异步处理方式的变化。API介绍为了实现这个功能,我们需要用到几个NodejsAPI,下面简单介绍一下。fs.readdirreaddir方法用于读取目录并返回包含文件和目录的数组。fs.statstat方法的参数是一个文件或目录,它会生成一个包含有关文件或目录的特定信息的对象。另外,对象有一个isFile()方法来判断正在处理的是文件还是目录。思路分析我们的基本实现思路是:使用fs.readdir获取指定目录的内容信息,循环遍历内容信息,使用fs.stat获取文件或目录的具体信息,存储具体信息,过滤内容全部存储完毕。就是文件的信息遍历和比较,找出最大的文件,获取并返回最大的文件,下面直接上代码。回调函数varfs=require('fs');varpath=require('path');functionfindLargest(dir,cb){//读取目录下的所有文件fs.readdir(dir,function(er,files){if(er)returncb(er);varcounter=files.length;varerrored=false;varstats=[];files.forEach(function(file,index){//读取文件信息fs.stat(path.join(dir,file),function(er,stat){if(errored)return;if(er){errored=true;returncb(er);}stats[index]=stat;//提前计算Howmanyfilesarethere?读取完1个文件的信息后,count会减1,为0时表示读取完成,此时进行最后的比较操作if(--counter==0){varlargest=stats.filter(function(stat){returnstat.isFile()}).reduce(function(prev,next){if(prev.size>next.size)returnprevreturnnext})cb(null,files[stats.indexOf(largest)])}})})})}使用方式为://查找当前目录最大的文件findLargest('./',function(er,filename){if(er)returnconsole.error(er)console.log('largestfilewas:',filename)});Promisevarfs=require('fs');varpath=require('path');varreadDir=function(dir){returnnewPromise(function(resolve,reject){fs.readdir(dir,function(err,files){if(err)reject(err);resolve(files)})})}varstat=function(path){returnnewPromise(function(resolve,reject){fs.stat(path,function(err,stat){if(err)reject(err)resolve(stat)})})}functionfindLargest(dir){returnreadDir(dir).then(function(files){letpromises=files.map(file=>stat(path.join(dir,file)))returnPromise.all(promises).then(function(stats)){return{stats,files}})}).then(data=>{letlargest=data.stats.filter(function(stat){returnstat.isFile()}).reduce((prev,next)=>{if(prev.size>next.size)returnprevreturnnext})returndata.files[data.stats.indexOf(largest)]})}使用方式为:findLargest('./').then(function(filename)){console.log('largestfilewas:',filename);}).catch(function(){console.log(error);});Generatorvarfs=require('fs');varpath=require('path');varco=require('co')varreadDir=function(dir){returnnewPromise(function(resolve,reject){fs.readdir(dir,function(err,files){if(err)reject(err);resolve(files)})})}varstat=function(path){returnnewPromise(function(resolve,reject){fs.stat(path,function(err,stat){如果(错误)reject(err)resolve(stat)})})}function*findLargest(dir){varfiles=yieldreadDir(dir);varstats=yieldfiles.map(function(file){returnstat(path.join(dir,file))})letlargest=stats.filter(function(stat){returnstat.isFile()}).reduce((prev,next)=>{if(prev.size>next.size)returnprevreturnnext})returnfiles[stats.indexOf(largest)]}使用方法为:co(findLargest,'./').then(function(filename){console.log('largestfilewas:',filename);}).catch(function(){console.log(error);});Asyncvarfs=require('fs');varpath=require('path');varreadDir=function(dir){returnnewPromise(function(resolve,reject){fs.readdir(dir,function(err,files){if(err)reject(err);resolve(files)})})}varstat=function(path){returnnewPromise(function(resolve,reject){fs.stat(path,function(err,stat){if(err)reject(err)resolve(stat)})})}asyncfunctionfindLargest(dir){varfiles=awaitreadDir(dir);letpromises=files.map(file=>stat(path.join(dir,file)))varstats=awaitPromise.all(promises)letlargest=stats.filter(function(stat){返回stat.isFile()}).reduce((prev,next)=>{if(prev.size>next.size)returnprevreturnnext})returnfiles[stats.indexOf(largest)]}使用方法为:findLargest('./').then(function(filename){console.log('最大的文件是:',filename);}).catch(function(){console.log(error);});ES6系列ES6系列目录地址:https://github.com/mqyqingfeng/BlogES6该系列预计写20篇左右,旨在加深对一些ES6知识点的理解,重点关注块级作用域、标签模板、箭头functions,Symbol,Set,MapandPromise模拟实现,模块加载方案,异步处理等,如有错误或不准确的地方,请务必指正,万分感谢。如果你喜欢或者有启发,欢迎star,这也是对作者的鼓励。