详解ES6系列之异步处理实战

  

<强>前言
  

  

我们以查找指定目录下的最大文件为例,感受从

  

回调函数→承诺→发电机→异步

  

异步处理方式的改变。

  

<强> 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系列之异步处理实战