<强>前言强>
我们以查找指定目录下的最大文件为例,感受从
回调函数→承诺→发电机→异步
异步处理方式的改变。
<强> API介绍强>
为了实现这个功能,我们需要用到几个Nodejs的API,所以我们来简单介绍一下。
<强> fs。readdir 强>
readdir方法用于读取目录,返回一个包含文件和目录的数组。
<强> fs。统计强>
统计方法的参数是一个文件或目录,它产生一个对象,该对象包含了该文件或目录的具体信息。此外,该对象还有一个isFile()方法可以判断正在处理的到底是一个文件,还是一个目录。
<>强思路分析强>
我们基本的实现思路就是:
-
<李>用fs。readdir获取指定目录的内容信息李>
<李>循环遍历内容信息,使用fs。统计获取该文件或者目录的具体信息李>
<李>将具体信息储存起来李>
<李>当全部储存起来后,筛选其中的是文件的信息李>
<李>遍历比较,找出最大文件李>
<李>获取并返回最大文件李>
然后我们直接上代码吧。
回调函数
var fs=要求(fs); var=路径要求(“路径”); 函数findLargest (dir, cb) {//读取目录下的所有文件 fs。readdir (dir、功能(呃,文件){ 如果(er)返回cb (er); var counter=files.length; var错误=false; var属性=[]; 文件。forEach(函数(文件、索引){//读取文件信息 fs.stat(路径。加入(dir,文件)、功能(呃,stat) { 如果(错误)返回; 如果(er) { 错误=true; 返回cb (er); } 统计(指数)=统计;//事先算好有多少个文件,读完1个文件信息,计数减1,当为0时,说明读取完毕,此时执行最终的比较操作 如果(- counter==0) { 最大var=统计数据 .filter(函数(stat){返回stat.isFile ()}) .reduce(函数(上一页,下一页){ 如果(上一页。大小比;next.size)返回上一页 返回下一个 }) cb (null,文件[stats.indexOf(最大))) } }) }) }) } >之前使用方式为:
//查找当前目录最大的文件 findLargest ('。/',函数(呃,文件名){ 如果(er)返回console.error (er) 控制台。日志(最大文件是:,文件名) }); 承诺 var fs=要求(fs); var=路径要求(“路径”); var readDir=function (dir) { 返回新的承诺(函数(解决,拒绝){ fs。readdir (dir、功能(呃,文件){ 如果(err)拒绝(错); 解决(文件) }) }) } var属性=function(路径){ 返回新的承诺(函数(解决,拒绝){ fs。stat(路径,函数(呃,统计){ 如果(err)拒绝(err) 解决(统计) }) }) } 函数findLargest (dir) { 返回readDir (dir) 不要犹豫(函数(文件){ 我们承诺=文件。地图(文件=比;stat(路径。加入(dir,文件))) 返回Promise.all(承诺),然后(功能(数据){ 返回{统计数据、文件} }) }) 不要犹豫(data=https://www.yisu.com/zixun/> { 让最大=data.stats .filter(函数(stat){返回stat.isFile ()}) .reduce((上一页,下一页)=> { 如果(上一页。大? next.size)返回上一页 返回下一个 }) 返回data.files [data.stats.indexOf(最大) }) } >之前使用方式为:
findLargest (“/? 不要犹豫(函数(文件名){ 控制台。日志(最大文件是:,文件名); }) .catch(函数(){ console.log(错误); }); 发电机 var fs=要求(fs); var=路径要求(“路径”); var .=要求(“公司”) var readDir=function (dir) { 返回新的承诺(函数(解决,拒绝){ fs。readdir (dir、功能(呃,文件){ 如果(err)拒绝(错); 解决(文件) }) }) } var属性=function(路径){ 返回新的承诺(函数(解决,拒绝){ fs。stat(路径,函数(呃,统计){ 如果(err)拒绝(err) 解决(统计) }) }) } 函数* findLargest (dir) { var文件=产量readDir (dir); var属性=产量files.map(函数(文件){ 返回属性(路径。加入(dir、文件) }) 让最大=统计数据 .filter(函数(stat){返回stat.isFile ()}) .reduce((上一页,下一页)=比;{ 如果(上一页。大小比;next.size)返回上一页 返回下一个 }) 返回文件[stats.indexOf(最大) }详解ES6系列之异步处理实战