在下面的示例中,我从Sequelize docs中获取了有关事务的信息,我不明白为什么你必须为查询和sequelize事务方法添加return语句。
function doTransaction () {
return sequelize.transaction(function (t) {
// chain all your queries here. make sure you return them.
return User.create({
firstName: 'Abraham',
lastName: 'Lincoln'
}, {transaction: t}).then(function (user) {
return user.setShooter({
firstName: 'John',
lastName: 'Boothe'
}, {transaction: t});
});
}).then(function (result) {
// Transaction has been committed
// result is whatever the result of the promise chain returned to the transaction callback
}).catch(function (err) {
// Transaction has been rolled back
// err is whatever rejected the promise chain returned to the transaction callback
});
}
答案 0 :(得分:2)
如果你的诺言then
链中有一些东西没有返回任何东西,那么就假定该方法没有做任何属于链的一部分。如果您想扩展链条,那么您有责任返回承诺。这是承诺驱动设计的基本原则之一。
此处事务代码需要知道何时可以提交事务。如果你没有在那个区块内返回promises,那么它将继续并在那些插入操作接近完成之前很久就关闭它。这是异步代码的本质。您需要在不同级别之间进行协调。
如果您忘记在这种情况下返回值,您的代码可能可以正常工作,但它也会出现不可预测的行为,引入细微的错误,如果不加以修正可能会导致混乱。建立一个适当的承诺现在看起来是一个好主意,return
语句应该出现在链中的任何内容中,并构造代码以便错误显而易见。