nodejs fs.readdir的问题
从node.js + express4 写一个自己的博客网站教程中写代码,发现获取所有文件夹下的文件,最终结果如何在外面得到呢??return 返回的不是getBlogList的返回值吧?
function getBlogList(blogDir) {
fs.readdir(blogDir, function (err, files) {
var blogList = [];
if (files && files.length) {
files.forEach(function (filename) {
//split file name and generate url...
//...
//create a blogItem { title: blogTitle, url: blogUrl }
blogList.push(blogItem);
});
}
return blogList;
});
}
刚接触node,疑惑很久,请各位赐教~谢谢
7 回复
由于fs.readdir为异步操作,你可以使用回调函数来做:
function getBlogList(blogDir, callback) {
fs.readdir(blogDir, function (err, files) {
var blogList = [];
if (files && files.length) {
files.forEach(function (filename) {
//split file name and generate url...
//...
//create a blogItem { title: blogTitle, url: blogUrl }
blogList.push(blogItem);
});
}
callback(blogList);
});
}
getBlogList的使用是这样:
getBlogList('<BLOG_DIR>', function(list) {
// You can get blog list here.
});
function getBlogList(blogDir, callback) {
fs.readdir(blogDir, function (err, files) {
if(err) return callback(err);
var blogList = [];
if (files && files.length) {
files.forEach(function (filename) {
//split file name and generate url...
//...
//create a blogItem { title: blogTitle, url: blogUrl }
blogList.push(blogItem);
});
}
return callback(null, blogList);
});
}
getBlogList('dir', function(err, list){
handle(list);
});
现在我终于知道为什么async不够用,需要promise,我也知道为什么promise也不够用了,要generator,我也知道generator为什么不够用了,要fibjs,都是异步惹得祸啊。 楼主如果需要遍历目录内的目录的话,恐怕还要加点代码。给个参考dir 看看着那一层层的回调,有的人深恶痛绝,有的却是很喜欢的,我就是喜欢的那种人。
顺便求高人用promise也实现一个,让我顺便学习一下promise的用法,回调其实倒不可怕,可怕的是那些一层又一层的错误处理,promise只懂皮毛,还望大神来答疑。
@zhengchubo 谢谢啊~解决啦
@coordcn 嘿嘿 学习啦~~谢谢
var Promise = require("bluebird"),
readDir = Promise.promisify(require("fs").readdir);
readDir(blogDir)
.then(function(files){
var blogList = [];
if (files && files.length) {
files.forEach(function (filename) {
//split file name and generate url...
//...
//create a blogItem { title: blogTitle, url: blogUrl }
blogList.push(blogItem);
});
}
return blogList;
})
.then(handle)
.catch(SyntaxError,function(e){
//File error
})
.catch(function(e){
//any other error
})
太棒了,遇到了同样的问题,谢谢:)
我去,踩到盗洞了。还以为 2 楼在开嘲讽。6楼支持你直接 fs.readdirSync