asegurar que cada bucle termine antes del siguiente comando js

Disculpas si solo estoy siendo grueso. He intentado la función de búsqueda, pero al ser relativamente nuevo en todo esto, estoy luchando para encontrar la solución. Creo que probablemente no estoy buscando la palabra clave correcta.

Tengo una ruta en mi aplicación Node.js que tiene dos bucles forEach en ella. Quiero que cada bucle 1 termine, luego comienzo por cada bucle 2. Cuando termine, quiero llamar a mi redireccionamiento de res. Actualmente, la ruta va directamente a res.redirect y no parece estar completando los bucles forEach.

Código:

// Auto-populate entries router.post("/populate", middlewareObj.isLoggedIn, function(req, res) { var baseData = [] //lookup Plan using ID Plan.findById(req.params.id, function(err, foundPlan) { if (err) { console.log(err); res.redirect("/plans"); } else { BaseData.find({ "contributingRegion": foundPlan.contributingRegion }, function(err, foundRecords) { foundRecords.forEach(function(record) { baseData.push(record) baseData.save }); //Create entries & push into plan baseData.forEach(function(data) { if (includes(req.body.orgs, data.org)) { Entry.create(data, function(err, entry) { if (err) { console.log(err); } else { entry.author.id = req.user._id; entry.author.username = req.user.username; entry.save(); foundPlan.planEntries.push(entry); foundPlan.save(); } }) } }) res.redirect('/plans/' + foundPlan._id); }); } }); }); 

Hay muchas maneras de lograr esto, por ejemplo, podría usar promesas o un módulo asíncrono , también podría usar funciones recurrentes , proporcionaré una solución con el módulo asíncrono porque le permitirá comprender cómo funcionan las funciones asíncronas y cómo controlarlas:

 async.each( baseData, function (data, next) { if (includes(req.body.orgs, data.org)) { Entry.create(data, function(err, entry) { if (err) { // stop iterating and pass error to the last callback next(err); } else { entry.author.id = req.user._id; entry.author.username = req.user.username; entry.save(); foundPlan.planEntries.push(entry); foundPlan.save(); // next iteration next(); } }); } else { // next iteration next(); } }, function (err) { // This function runs when all iterations are done if (err) throw err; res.redirect('/plans/' + foundPlan._id); } );