【发布时间】:2016-05-14 19:42:31
【问题描述】:
我的目标是遍历文件目录,对每个文件运行一些操作,并返回一个包含目录子集的 json 对象。
我使用 Node 的 fs 库中的同步调用版本让它工作,但我想找出最好的异步解决方案。我在异步版本上的失败尝试低于使用 Q 库延迟。无论我做什么,我都无法将最后一步推迟到迭代完成。
迭代成功完成,但不是在调用 sendResponse() 之前。
谁能帮我理解我做错了什么?
router.get('/mediaTree', function(req, res){
var mediaTree = { "identifier" : "id", "label" : "name", "items" : []};
var idCounter = 1;
var fs_readdir = q.denodeify(fs.readdir);
fs_readdir(MEDIAPATH)
.then(function(files) {
files.forEach(function(dir) {
fs.stat(MEDIAPATH + dir, function(err, stats) {
if(err) { console.log(err); return; }
var thisFile = {};
if(stats.isDirectory()) {
thisFile.id = idCounter++;
thisFile.type = "branch";
thisFile.name = dir;
thisFile.path = MEDIAPATH + dir;
mediaTree.items.push(thisFile);
}
});
});
})
.then(sendResponse);
function sendResponse() {
res.json(mediaTree);
}
});
【问题讨论】:
-
你不是在等待 fs.stats 调用回来
-
看起来值得换成蓝鸟。
-
slaks文章总结,将
promises.push(fa.stat ...)返回的所有promise保存到数组和return Promise.all(promises)
标签: javascript node.js express promise