33

This is what I have:

#! /usr/bin/env node

var fs = require('fs'),
    files = fs.readdirSync(__dirname + '/files/'),

files.forEach(function(file) {
  fs.readFile(__dirname + '/files/' + file, 'utf8', function (error, data) {
    console.log(data)
  })
})

Even though I'm using readdirSync the output is still asynchronous:

alex@alex-K43U:~/node/readFiles$ node index.js 
foo 1

foo 3

foo 2

How to modify the code so the output becomes synchronous?

alex@alex-K43U:~/node/readFiles$ node index.js 
foo 1

foo 2

foo 3
alexchenco
  • 53,565
  • 76
  • 241
  • 413
  • I think your problem is that `forEach` doesn t garantee order, you should try with a dumb for loop. Also, you should use readFileSync if you want to read files syncronously – DrakaSAN Dec 07 '15 at 14:15

3 Answers3

65

You need to use readFileSync, your method is still reading the files asynchronously, which can result in printing the contents out of order depending on when the callback happens for each read.

var fs = require('fs'),
    files = fs.readdirSync(__dirname + '/files/');

files.forEach(function(file) {
  var contents = fs.readFileSync(__dirname + '/files/' + file, 'utf8');
  console.log(contents);
})
Gazler
  • 83,029
  • 18
  • 279
  • 245
7

That's because you read the file asynchronously. Try:

#! /usr/bin/env node

var fs = require('fs'),
    files = fs.readdirSync(__dirname + '/files/'),

files.forEach(function(file) {
  var data = fs.readFileSync(__dirname + '/files/' + file, 'utf8');
  console.log(data);
});

NodeJS Documentation for 'fs.readFileSync()'

Justin Russo
  • 2,214
  • 1
  • 22
  • 26
Peter Paul Kiefer
  • 2,114
  • 1
  • 11
  • 16
2

Have you seen readFileSync? I think that could be your new friend.

Daniel A. White
  • 187,200
  • 47
  • 362
  • 445