0

Using readFile json to return array messages, object return empty array, why?

My code:

var fs = require("fs"); // filesystem

class Message {

   constructor() {
      this._message_list = [];
   }

   set message_list(val) {

      this._message_list = val;
   }

   get message_list() {
     return this._message_list;
   }

   getMessages() {

      fs.readFile("./models/messages-list.json", "utf8", (err, data) => {
       if(err){
         return err;
       }
        // append array messages
        this._message_list = Object.keys(JSON.parse(data));
        console.log(this._message_list); // return ["message 1", "message 2"]
});

    return this._message_list; // return array messages
 }

}

module.exports = {
  Message
};


var Message = require("./models/message");

let mensagem = null;
mensagem = new Message.Message();
console.log( mensagem.getMessages()); //return []

How return my array messages? Way my this._message_list return empty array?

Cœur
  • 37,241
  • 25
  • 195
  • 267
csassis
  • 65
  • 1
  • 7
  • `readFile` is asynchronous. Have a [read at this answer](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – CodingIntrigue Jan 05 '18 at 11:52

1 Answers1

1

Because fs.readFile is asynchronous, it won't return before you do:

// return array messages
return this._message_list;

If you use fs.readFileSync, this should work..

getMessages() {
    var data = fs.readFileSync("./models/messages-list.json", "utf8");

    this._message_list = Object.keys(JSON.parse(data));

    // log ["message 1", "message 2"]
    console.log(this._message_list);

    // return array messages
    return this._message_list;
}
GottZ
  • 4,824
  • 1
  • 36
  • 46
Terry Lennox
  • 29,471
  • 5
  • 28
  • 40