Search code examples
javascriptnode.jses6-promise

Wait for loop to complete before running further code


Here is some code I've been working on:

let b = [];

for (let i = 0; i < res.length; i++) {
  let fooFound = false;
  const foo = require(`./modules/${res[i]}`);

  rest.get(Routes.applicationCommands("BLAH")).then((c) => {

    b = c;
    
    if (b) {
      b.forEach((command) => {
        if (command.name === foo.name) {
          fooFound = true;
        }
      });

      if (fooFound === false) {
        b.push({
          name: foo.name,
          description: foo.description,
        });

      }
    }
  });

  
}

console.log(b);

The problem that I am experiencing is that the code that is after the loop (here the console.log(b)) is running before the loop is finished.

I tried to get it to work with promises but couldn't solve it.


Solution

  • What you're facing is because the Promise completes later after the console.log(b); done.
    Simplest approach to solve this just by wrapping it in async/await.

    
    const myProgram = async () => {
      let b = [];
      const myLoop = async () => {
       
    
        for (let i = 0; i < res.length; i++) {
          let fooFound = false;
          const foo = require(`./modules/${res[i]}`);
    
          const c = await rest.get(Routes.applicationCommands("BLAH"));
          b = c;
            
          if (b) {
            b.forEach((command) => {
              if (command.name === foo.name) {
                fooFound = true;
              }
            });
    
            if (fooFound === false) {
              b.push({
                name: foo.name,
                description: foo.description,
              });
            }
          }
    
        }
      }
      await myLoop();
      console.log(b);
    }