判断异步请求是否结束?
发布于 5 年前 作者 kidbai 4182 次浏览 来自 问答

需求: 找到所有文件夹下文件的下载信息 场景:某个网站有可下载的文件夹,文件夹中可能包含文件文件夹两种类型的东西。文件夹下一层目录的信息可以通过请求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));

希望这个能给你思路。其中,把readDirAsynclstatAsync 换成你的函数调用就差不多了,能获得所有文件,然后下面进行处理。

回到顶部