我们的目的是读取一个目下所有的文件,然后获取这些文件的状态信息,将这些状态信息通过一个数组传给回调函数。
我们先使用CALLBACK来完成题目。初步估计会有下面这样的回调过程
fs.exists
fs.readdir
fs.stat
接着我们完成函数
var fs = require('fs');
//使用大量回调函数的做法
function getFileStatusCallBack(path,callBack){
fs.exists(path,function(existed){
if(existed){
fs.readdir(path,function(err,files){
if(err){
throw err;
}
var fileCounter = 0,
totalFiles = files.length,
result = [];
files.forEach(function(fileName,index,fils){
fs.stat(path + fileName,function(err,stat){
if(err) throw err;
result[index] = {};
result[index].name = fileName;
result[index].size = stat.size;
if(++fileCounter === totalFiles){
callBack(result);
}
});
});
});
}
});
}
我们看到大量的回调会给以后的代码维护带来巨大麻烦。尝试着使用PROMISE来重构这段代码吧
var readdir = Q.denodeify(fs.readdir);
//使用Q
function stat(file){
return Q.nfcall(fs.stat,file).then(function(stats){
var result = {};
result.name = file;
result.size = stats.size;
return result;
});
}
function openDir(path) {
return readdir(path).then(function(files){
return files.map(function(file){
return stat(path + file);
});
}).then(Q.all);
}
openDir('xxx').then(console.log).fail(function(err){
console.log(err);
});
需要认真体会比较以上两段代码
这篇博客讲述了如何在NodeJS中将回调函数转换为Promise,以解决多层嵌套回调导致的代码复杂性问题。内容包括读取目录下所有文件并获取文件状态,最终通过Promise处理结果数组。

1万+

被折叠的 条评论
为什么被折叠?



