我目前正在构建一个Nodejs,Express,Sequelize(w.Postgresql)应用程序,并且遇到了一些使用promises以及事务和循环的问题.
我想知道如何在事务中使用for循环.我试图循环遍历一个成员列表,并在数据库中为每个成员创建一个新的用户.
任何人都可以指向正确的方向吗?
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); });
解决方法
你应该使用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],{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); });
我不相信你需要在后续交易中捕获,因为我认为它会跳到交易的交易
对不起格式化.在移动.
Promise.all将等待所有承诺在运行之前返回(或失败).then,而..回调将是每个数组的所有承诺数据