Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js异步函数在循环中?_Javascript_Node.js_Asynchronous_Foreach - Fatal编程技术网

Javascript node.js异步函数在循环中?

Javascript node.js异步函数在循环中?,javascript,node.js,asynchronous,foreach,Javascript,Node.js,Asynchronous,Foreach,我在node.js上遇到了一些问题。我试图做的是在./+req.user.email中获得一个目录数组,然后循环查找它们的大小,并向输出中添加一个表行,如代码中所示。最后,我不想使用res.send发送所有表行 然而,我得到的唯一输出是: <tr></tr> 请将此模块用于此类图案。使用async.each将允许您异步计算每个文件夹的大小,然后在单独计算完所有内容后返回大小 var output = []; fs.readdir('./' + req.user.ema

我在node.js上遇到了一些问题。我试图做的是在./+req.user.email中获得一个目录数组,然后循环查找它们的大小,并向输出中添加一个表行,如代码中所示。最后,我不想使用res.send发送所有表行

然而,我得到的唯一输出是:

<tr></tr>
请将此模块用于此类图案。使用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。

您可以使用fs.lstatSync或更现代的编程模式。感谢您的帮助!但是,不确定在计算函数中放入什么?-1:无法解决用户的问题,未完成,错误处理错误,如果实现了递归,将重复调用回调,递归在哪里?递归将在计算函数中实现,因此所有其他点都没有任何意义。我不是要为OP解决问题,只是给他指出正确的方向
var fs = require ("fs");

var createTableContent = function (p, cb){
    var read = function (p, cb){
        //Prevent recursion if error
        if (err) return cb ();

        fs.stat (p, function (error, stats){
            if (error){
                err = error;
                return cb ();
            }

            if (stats.isDirectory ()){
                var dirSize = 0;

                fs.readdir (p, function (error, entries){
                    if (error){
                        err = error;
                        return cb ();
                    }

                    var pending = entries.length;
                    //Empty dir
                    if (!pending) return cb (0);

                    entries.forEach (function (entry){
                        read (p + "/" + entry, function (entrySize){
                            dirSize += entrySize;
                            if (!--pending) return cb (dirSize);
                        });
                    });
                });
            }else{
                cb (stats.size);
            }
        });
    };

    //A lot of errors can be produced, return only the first one
    var err = null;

    //Suppose p is a dir
    fs.readdir (p, function (error, entries){
        if (error) return cb (error);

        var content = "";
        var pending = entries.length;
        if (!pending) return cb (null, content);

        entries.forEach (function (entry){
            read (p + "/" + entry, function (totalSize){
                if (err) return cb (err);
                content += "<tr><td>" + entry + "</td><td>" + totalSize + "</td></tr>";
                if (!--pending){
                    //End
                    cb (null, content);
                }
            });
        });
    });
};

//Here goes the "email" path
createTableContent (".", function (error, content){
    if (error) return console.error (error);

    console.log (content);
});
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);
}
var fs = require ("fs");

var createTableContent = function (p, cb){
    var read = function (p, cb){
        //Prevent recursion if error
        if (err) return cb ();

        fs.stat (p, function (error, stats){
            if (error){
                err = error;
                return cb ();
            }

            if (stats.isDirectory ()){
                var dirSize = 0;

                fs.readdir (p, function (error, entries){
                    if (error){
                        err = error;
                        return cb ();
                    }

                    var pending = entries.length;
                    //Empty dir
                    if (!pending) return cb (0);

                    entries.forEach (function (entry){
                        read (p + "/" + entry, function (entrySize){
                            dirSize += entrySize;
                            if (!--pending) return cb (dirSize);
                        });
                    });
                });
            }else{
                cb (stats.size);
            }
        });
    };

    //A lot of errors can be produced, return only the first one
    var err = null;

    //Suppose p is a dir
    fs.readdir (p, function (error, entries){
        if (error) return cb (error);

        var content = "";
        var pending = entries.length;
        if (!pending) return cb (null, content);

        entries.forEach (function (entry){
            read (p + "/" + entry, function (totalSize){
                if (err) return cb (err);
                content += "<tr><td>" + entry + "</td><td>" + totalSize + "</td></tr>";
                if (!--pending){
                    //End
                    cb (null, content);
                }
            });
        });
    });
};

//Here goes the "email" path
createTableContent (".", function (error, content){
    if (error) return console.error (error);

    console.log (content);
});