我目前正在构建一个 Nodejs、Express、Sequelize (w. PostgreSQL) 应用程序,并且在将 Promise 与事务和循环一起使用时遇到了一些问题。
我正在尝试弄清楚如何在事务中使用 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], '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);
});
我认为您不需要在 sequelize 交易中 catch
,因为我认为它会跳出交易的 catch
抱歉格式化。在移动。
Promise.all 会在运行 .then 之前等待所有的 Promise 返回(或失败),而 .then
回调将是每个数组中的所有 Promise 数据
关于javascript - 在 Sequelize 的事务中使用循环和 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35705622/