LogaKrishnan
LogaKrishnan

Reputation: 501

To run Node js program synchronously after for loop

i want to execute the last console statement after all the for loop execution, but that console statement executes immediately when control enters else statement, please help me to solve this issue

if (false) {
  //
} else {
  //pushing the scenarios object id from project table to scenarios array
  // function async(project) {    
  // Promise((resolve, reject) => {
  for (i = 0; i < projectToBeDeleted[0].scenarios.length; i++) {
    scenarios.push(projectToBeDeleted[0].scenarios[i])
  }
  //iterating the scenario table to get the child scenarios from all matching scenarios
  for (i = 0; i < scenarios.length; i++) {
    query = { "_id": scenarios[i] }
    Scenario.getScenarios(query)
      .then((scenariosResponse) => {
        for (j = 0; j < scenariosResponse[0].childScenario.length; j++) {
          scenarios.push(scenariosResponse[0].childScenario[j])
        }
      })
      .catch((error) => {
        res.status(400).send({
          message: error.stack
        })
      })
  }
  // })
  console.log("sync", scenarios)
}

Upvotes: 0

Views: 33

Answers (1)

hlobit
hlobit

Reputation: 166

You might want to use Promise.all([]).then().

See the docs.

EDIT: example with your specific problem

for (i = 0; i < projectToBeDeleted[0].scenarios.length; i++) {
  scenarios.push(projectToBeDeleted[0].scenarios[i]);
}

const promises = [];
for (i = 0; i < scenarios.length; i++) {
  const query = { "_id": scenarios[i] }
  const promise = Scenario.getScenarios(query)
    .then((scenariosResponse) => {
      for (j = 0; j < scenariosResponse[0].childScenario.length; j++) {
        scenarios.push(scenariosResponse[0].childScenario[j])
      }
    })
    .catch((error) => {
      res.status(400)
        .send({
          message: error.stack
        })
    })
  promises.push(promise);
}

Promise.all(promises).then(() => {
  console.log("sync", scenarios)
})

Upvotes: 2

Related Questions