0

我想在 Node.js 中调用一个函数,获取结果并将它们发送到模板。results总是返回空。

怎么了?

var replace = req.params.replace || "";
var find = req.params.find;
var fs = require("fs");
var dir = "./public/sounds/";
var results = [];

var readFiles = function (root) {
    fs.readdir(root, function (err, files) {
        if (err) {
            console.log(err);
            return;
        }
        files.forEach(function (file) {
            console.log(root.concat(file));
            fs.stat(root.concat(file), function (err, stat) {
                if (stat && stat.isDirectory()) {
                    readFiles(root.concat(file + "/"));
                }
            });
            if (file.indexOf(find) > 0) {
                var oldPath = root.concat(file);
                var newPath = oldPath.replace(find, replace).trim();
                console.log("Old Path: ", oldPath, " New Path: ", newPath);
                fs.rename(oldPath, newPath);
                results.push(newPath);
            }
        })

    });
};
readFiles(dir);
res.jsonp({
    message: results
});
4

1 回答 1

0
var results = [];
...some async stuff...
console.log(results);

每次都会打印空数组,所以如何修复。

简短的回答:

var async = require('async');
async.each(files, function (file) { ... },
  function (error, results) { 
    res.jsonp({
      message: results
    });
  });

更长的答案,您的代码分支笨拙,因此需要进行一些重组才能正常工作。

var async = require('async');
var replace = req.params.replace || "";
var find = req.params.find;
var fs = require("fs");
var dir = "./public/sounds/";


var readFiles = function (root, cb) {
    var results = [];
    fs.readdir(root, function (err, files) {
        if (err) {
            cb(err);
            return;
        }
        aync.each(file, function (file, cb) {
            console.log(root.concat(file));
            fs.stat(root.concat(file), function (err, stat) {
                if (err) {
                  return cb(err);
                }
                if (stat && stat.isDirectory()) {
                    readFiles(root.concat(file + "/"), function (err, res) {
                      results = results.concat(res);
                      cb(err);
                    });
                } else {
                    if (file.indexOf(find) > 0) {
                        var oldPath = root.concat(file);
                        var newPath = oldPath.replace(find, replace).trim();
                        console.log("Old Path: ", oldPath, " New Path: ", newPath);
                        fs.rename(oldPath, newPath);
                        results.push(newPath);
                    }
                    cb();
                }
            });

        }, function (err) {
            cb(err, results);
        });

    });
};
readFiles(dir, function (err, results) {
  res.jsonp({
    message: results
  });
});

我还没有测试过,所以如果你在调试它时遇到问题,请告诉我。

于 2013-04-12T19:01:36.890 回答