时间:2021-05-25
前言
我们以查找指定目录下的最大文件为例,感受从
回调函数 -> Promise -> Generator -> Async
异步处理方式的改变。
API 介绍
为了实现这个功能,我们需要用到几个 Nodejs 的 API,所以我们来简单介绍一下。
fs.readdir
readdir 方法用于读取目录,返回一个包含文件和目录的数组。
fs.stat
stat 方法的参数是一个文件或目录,它产生一个对象,该对象包含了该文件或目录的具体信息。此外,该对象还有一个 isFile() 方法可以判断正在处理的到底是一个文件,还是一个目录。
思路分析
我们基本的实现思路就是:
然后我们直接上代码吧。
回调函数
使用方式为:
// 查找当前目录最大的文件findLargest('./', function(er, filename) { if (er) return console.error(er) console.log('largest file was:', filename)});Promisevar fs = require('fs');var path = require('path');var readDir = function(dir) { return new Promise(function(resolve, reject) { fs.readdir(dir, function(err, files) { if (err) reject(err); resolve(files) }) })}var stat = function(path) { return new Promise(function(resolve, reject) { fs.stat(path, function(err, stat) { if (err) reject(err) resolve(stat) }) })}function findLargest(dir) { return readDir(dir) .then(function(files) { let promises = files.map(file => stat(path.join(dir, file))) return Promise.all(promises).then(function(stats) { return { stats, files } }) }) .then(data => { let largest = data.stats .filter(function(stat) { return stat.isFile() }) .reduce((prev, next) => { if (prev.size > next.size) return prev return next }) return data.files[data.stats.indexOf(largest)] })}使用方式为:
findLargest('./').then(function(filename) { console.log('largest file was:', filename);}).catch(function() { console.log(error);});Generatorvar fs = require('fs');var path = require('path');var co = require('co')var readDir = function(dir) { return new Promise(function(resolve, reject) { fs.readdir(dir, function(err, files) { if (err) reject(err); resolve(files) }) })}var stat = function(path) { return new Promise(function(resolve, reject) { fs.stat(path, function(err, stat) { if (err) reject(err) resolve(stat) }) })}function* findLargest(dir) { var files = yield readDir(dir); var stats = yield files.map(function(file) { return stat(path.join(dir, file)) }) let largest = stats .filter(function(stat) { return stat.isFile() }) .reduce((prev, next) => { if (prev.size > next.size) return prev return next }) return files[stats.indexOf(largest)]}使用方式为:
co(findLargest, './').then(function(filename) { console.log('largest file was:', filename);}).catch(function() { console.log(error);});Asyncvar fs = require('fs');var path = require('path');var readDir = function(dir) { return new Promise(function(resolve, reject) { fs.readdir(dir, function(err, files) { if (err) reject(err); resolve(files) }) })}var stat = function(path) { return new Promise(function(resolve, reject) { fs.stat(path, function(err, stat) { if (err) reject(err) resolve(stat) }) })}async function findLargest(dir) { var files = await readDir(dir); let promises = files.map(file => stat(path.join(dir, file))) var stats = await Promise.all(promises) let largest = stats .filter(function(stat) { return stat.isFile() }) .reduce((prev, next) => { if (prev.size > next.size) return prev return next }) return files[stats.indexOf(largest)]}使用方式为:
findLargest('./').then(function(filename) { console.log('largest file was:', filename);}).catch(function() { console.log(error);});以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
ES6新的数组方法、集合、for-of循环、展开运算符(...)甚至异步编程都依赖于迭代器(Iterator)实现。本文会详解ES6的迭代器与生成器,并进一步挖
本文实例讲述了ES6中异步对象Promise用法。分享给大家供大家参考,具体如下:回忆一下ES5中的怎么使用异步方法//es5中的异步回调letajax=fun
本文实例讲述了es6中Promise对象基本功能与用法。分享给大家供大家参考,具体如下:Promise是异步编程的一种解决方案,解决——回调函数和事件ES6规定
本文实例讲述了ES6学习笔记之let与const用法。分享给大家供大家参考,具体如下:在ES6中不是var,而是通过let来声明变量,用const来声明常量,有
本文实例讲述了ES6新特性之Symbol类型用法。分享给大家供大家参考,具体如下:Symbol类型1.为了避免属性名的冲突,ES6新增了Symbol类型。Sym