gpt4 book ai didi

javascript - Node.js 循环中的异步函数?

转载 作者:太空宇宙 更新时间:2023-11-04 02:47:58 24 4
gpt4 key购买 nike

我在使用 Node.js 时遇到一些问题。我想做的是获取“./”+req.user.email 中的目录数组,并循环遍历它们找出它们的大小并添加一个表行来输出,正如您在代码中看到的那样。最后我不想使用 res.send() 发送所有表行。

但是我得到的唯一输出是:

<tr></tr>

对于数组中的每个文件。看来forEach函数根本没有等待readSizeRecursive。 readSizeRecursive 函数是异步的,我相信这就是导致问题的原因,但我不知道如何解决这个问题。

任何帮助将不胜感激,我也包含了 readSizeRecursive 函数。谢谢!

  var output = "";
fs.readdir("./" + req.user.email, function (err, files) {
files.forEach(function(file){
output += "<tr>";
readSizeRecursive("./"+req.user.email+"/"+file, function (err, total){
output += '<td>' + file + '</td><td>' + total + '</td>';
});
output += "</tr>"
});
res.send(output)
});

readSizeRecursive():

// Function to find the size of a directory
function readSizeRecursive(item, cb) {
fs.lstat(item, function(err, stats) {
var total = stats.size;

if (!err && stats.isDirectory()) {
fs.readdir(item, function(err, list) {
async.forEach(
list,
function(diritem, callback) {
readSizeRecursive(path.join(item, diritem), function(err, size) {
total += size;
callback(err);
});
},
function(err) {
cb(err, total);
}
);
});
}
else {
cb(err, total);
}
});
}

最佳答案

请使用 async这种模式的模块。使用async.each将允许您异步计算每个文件夹的大小,然后在完成单独计算所有内容后返回大小。

var output = [];

fs.readdir('./' + req.user.email, function (err, files) {
async.each(compute, report);
});

function compute (file, done) {
// calculate size, then callback to signal completion
// produce a result like below, then invoke done()
var obj = { files: [
{ name: file, size: size },
{ name: file, size: size },
{ name: file, size: size }
]};
output.push(obj);
done();
}

// doesn't need to be this awful
function format (list) {
var result = [];

list.forEach(function (item) {
var description = item.files.map(function (file) {
return util.format('<td>%s</td><td>%s</td>', file.name, file.size);
});
result.push(description);
});

result.unshift('<tr>');
result.push('</tr>');
return result.join('</tr><tr>');
}

function report (err) {
if (err) { return next(err); }

var result = format(output);
res.send(result);
}

通过这种方式,您可以轻松地更换不同的功能,例如更改格式而不改变文件大小树的计算。

您的主要问题是控制流。当您异步循环并计算大小时,您会返回 res.send

关于javascript - Node.js 循环中的异步函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19640769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com