Search code examples
node.jses6-promise

Async Folder creation callback never happens


I am doing a set of async operations in following oder

  1. Read file
  2. Create Folder
  3. Write new file into that folder.

I have written my code using promise as follows.

const readMzFile = (fileName, type) =>
  new Promise((resolve, reject) =>
    fs.readFile(fileName, type, (err, data) => {
      return err ? reject(err) : resolve(data);
    })
  );

const createFolder = folderName =>
  new Promise((resolve, reject) =>
    fs.mkdir(folderName, function(err) {
      return err ? reject(err) : resolve();
    })
  );

const writeMyFile = (filename, type) =>
  new Promise((resolve, reject) =>
    fs.writeFile(filename, type, function(err) {
      return err ? reject(err) : resolve();
    })
  );

and I am using those promise functions as follows

readMyFile("xxx", "utf8")
  .then(function(data) {
    var generated = anotherFunc(package_data, data);
    var dir = "/home/malintha/test";
    createFolder(dir).then(function() {
      writeMyFile("xxx", generated_source).then(function() {
        console.log("File saved !!");
        res.end();
      });
    });
  })
  .catch(error => console.log("Error: ", error));

Reading file and creating folder happen but final step - file writing is not done and seems like it stuck after folder creation.

What is the issue in this code?


Solution

  • At first glance, the promisified functions don't look bad (though maybe look into util.promisify() so you don't need to do that by hand).

    At the very least, you're not returning the promises correctly, so exceptions might be hidden.

    How about something like this?

    readMyFile("xxx", "utf8")
      .then(function(data) {
        var generated = anotherFunc(package_data, data);
        var dir = "/home/malintha/test";
        return createFolder(dir)
          .then(() => writeMyFile("xxx", generated))
          .then(() => {
            console.log("File saved !!");
            res.end();
          });
      })
      .catch(error => console.log("Error: ", error));