Search code examples
node.jspromisefetch

Promise.all returning undefined in Node JS


I have a code to fetch directory names from first API. For every directory, need to get the file name from a second API. I am using something like this in my Node JS code -

async function main_function(req, res) {
  const response = await fetch(...)
    .then((response) => {
      if (response.ok) {
        return response.text();
      } else {
        return "";
      }
    })
    .then((data) => {
      dirs = ...some logic to extract number of directories...
      const tempPromises = [];

      for (i = 0; i < dirs.length; i++) {
        tempPromises.push(getFilename(i));
      }
      console.log(tempPromises); // Prints [ Promise { <pending> } ]
      Promise.all(tempPromises).then((result_new) => {
        console.log(result_new); // This prints "undefined"
        res.send({ status: "ok" });
      });
    });
}

async function getFilename(inp_a) {
  const response = await fetch(...)
    .then((response) => {
      if (response.ok) {
        return response.text();
      } else {
        return "";
      }
    })
    .then((data) => {
      return new Promise((resolve) => {
        resolve("Temp Name");
      });
    });
}

What am I missing here?


Solution

  • Thanks to Mat J for the comment. I was able to simplify my code and also learn when no to use chaining.

    Also thanks to Shadab's answer which helped me know that async function always returns a promise and it was that default promise being returned and not the actual string. Wasn't aware of that. (I am pretty new to JS)

    Here's my final code/logic which works -

    async function main_function(req,res){
        try{
          const response = await fetch(...)
          const resp = await response.text();
          dirs = ...some logic to extract number of directories...
          const tempPromises = [];
    
          for (i = 0; i < dirs.length; i++) {
             tempPromises.push(getFilename(i));
          }
          
          Promise.all(tempPromises).then((result_new) => {
             console.log(result_new);
             res.send({ status: "ok" });
           });
        }
        catch(err){
           console.log(err)
           res.send({"status" : "error"})
        }
    }
    
    async function getFilename(inp_a) {
      const response = await fetch(...)
      respText = await response.text();
      return("Temp Name"); //
    }