判断异步请求是否结束?
需求: 找到所有文件夹下文件的下载信息 场景:某个网站有可下载的文件夹,文件夹中可能包含文件和文件夹两种类型的东西。文件夹下一层目录的信息可以通过请求A获取,文件可以通过请求B获取文件的下载信息,我希望所有的B请求结束,拿到所有的下载地址并统一做处理。 文件夹的层级和文件的数量都是不明的。 目前node和浏览器都可以用eventproxy实现类似的场景,但据我了解,使用eventproxy我得知道有几个异步请求,如下有template、dat啊、和|10n 对于不知道数量的异步请求,如何实现?
_.template(template, data, l10n);
});
$.get("template", function (template) {
// something
ep.emit("template", template);
});
$.get("data", function (data) {
// something
ep.emit("data", data);
});
$.get("l10n", function (l10n) {
// something
ep.emit("l10n", l10n);
});```
2 回复
你需要遍历一个目录下的所有文件?
function walk(dir, ext, callback) {
ext = ext.charAt(0) === "." ? ext : `.${ext}`;
fs.readdir(dir, (err, files) => {
files.forEach(f => {
fs.lstat(path.join(dir, f), (err, st) => {
if (st.isDirectory()) {
walk(path.join(dir, f), ext, callback);
} else {
if (path.extname(f) === ext) {
callback(null, f);
}
}
})
});
});
}
function walk(dir) {
let readDirAsync = Promise.promisify(fs.readdir);
let lstatAsync = Promise.promisify(fs.lstat);
return readDirAsync(dir).then(files => {
return Promise.all(files.map(f => {
let file = path.join(dir, f);
return lstatAsync(file).then(stat => {
if (stat.isDirectory()) {
return walk(file);
} else {
return [file];
}
});
}));
}).then(files => {
return files.reduce((pre, cur) => pre.concat(cur));
});
}
walk("~/home").then(x => console.log(x));
希望这个能给你思路。其中,把readDirAsync
和lstatAsync
换成你的函数调用就差不多了,能获得所有文件,然后下面进行处理。