I am currently building a Nodejs, Express, Sequelize (w. PostgreSQL) app, and have run into a few problems with using promises together with transactions and loops.
I am trying to figure out how to use a for loops in a transaction. I am trying to loop through a list of members and create a new user in the database for each of them.
I know the following code is wrong but it shows what I am trying to do.
Can anyone point me in the right direction?
var members = req.body.members; models.sequelize.transaction(function (t) { for (var i = 0; i < members.length; i++) { return models.User.create({'firstname':members[i], 'email':members[i], 'pending':true}, {transaction: t}).then(function(user) { return user.addInvitations([group], {transaction: t}).then(function(){}).catch(function(err){return next(err);}); }) }; }).then(function (result) { console.log("YAY"); }).catch(function (err) { console.log("NO!!!"); return next(err); });
Advertisement
Answer
You should use a Promise.all
var members = req.body.members; models.sequelize.transaction(function (t) { var promises = [] for (var i = 0; i < members.length; i++) { var newPromise = models.User.create({'firstname':members[i], 'email':members[i], 'pending':true}, {transaction: t}); promises.push(newPromise); }; return Promise.all(promises).then(function(users) { var userPromises = []; for (var i = 0; i < users.length; i++) { userPromises.push(users[i].addInvitations([group], {transaction: t}); } return Promise.all(userPromises); }); }).then(function (result) { console.log("YAY"); }).catch(function (err) { console.log("NO!!!"); return next(err); });
I don’t believe you need to catch
within sequelize transactions as I think it jumps out to the catch on the transaction
Sorry for formatting. On mobile.
Promise.all will wait for all promises to return (or fail) before running the .then, and the .then
callback will be all the promise data from each array