javascript - 异步读取文件

标签 javascript node.js

我正在尝试读取一些文件并将它们的名称存储在 nodejs 的数组中。我做了一个函数。它读取文件,并在控制台中打印出来,但数组的输出是 []。我假设这是因为 node.js 是异步的,但我认为回调可以解决它?

readCurdir("./uploads/", curDirReadFinn); 
function readCurdir(dir, callback){
  var tmpArray = []; 
  fs.readdir(dir, function(err, files){
    if(err){
      if(err.code==='EISDIR'){}
      else{
        console.log(err);
      }
      return; 
    }
    files.forEach(function(file){
      fs.readFile(dir + file, 'utf-8', function(err, data){
        if(err){
          if(err.code==='EISDIR'){}
          else{
            console.log(err);
          }
          return; 
        }
        tmpArray.push(file); 
        console.log(file);   //this prints
      }); 
    }); 
  }); 
  callback(tmpArray); 
} 
function curDirReadFinn(array){ 
    console.log(array); //Output: []
}

我也试过这个:

files.forEach(function(file){
  fs.readFile(dir + file, 'utf-8', function(err, data){
    if(err){
      if(err.code==='EISDIR'){}
      else{
        console.log(err);
      }
      return; 
    }
    tmpArray.push(file); 
    counter++; 
    if(counter === files.lenght){
    callback(tmpArray); 
    }
  }); 
});

最佳答案

第二次尝试时您的想法是正确的。 在我简化它之后,它就完美地工作了:

function readCurdir(dir, callback){
  var tmpArray = []; 

  fs.readdir(dir, function(err, files) {
    if (err) {
      return console.log(err);
    }

    var counter = files.length;

    files.forEach(function(file) {
      fs.stat(path.join(dir, file), function(err, stats) {
        if (err) {
          console.log(err);
        }
        else if (stats.isFile()) {
          tmpArray.push(file); 
        }

        --counter === 0 && callback(tmpArray);
      }); 
    });
  }); 
} 

您可以使用 async 进一步简化它(并更容易传播错误)模块:

async.each(files, function(file, cb) {
  fs.stat(path.join(dir, file), function(err, stats) {
    if (err) {
      return cb(err);
    }
    else if (stats.isFile()) {
      tmpArray.push(file); 
    }

    cb();
  }); 
}, function(err) {
    callback(err, tmpArray)
});

关于javascript - 异步读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37874827/

相关文章:

javascript - 使用 javascript 或 PHP 查找最大 X 数的总和

javascript - 避免脚本无响应的跨浏览器方法

javascript - 如何将 div 放在 p 的特定行上?

javascript - node.js 博客应用程序教程

javascript - Node-Webkit 无法打开文件

node.js - 通过 POST 请求将数据从 node.js 服务器发送到 node.js 服务器

javascript - Bootstrap 多个弹出框显示和放置

node.js - Sequelize : 'findAll' in instance method getParticipants()?

javascript - Node.js 如何使用回调将数据发送到 Web 界面

javascript - "Waiting"在使用 native (ES6) JavaScript promise 的 promise 或常规对象上