【发布时间】:2015-02-08 04:56:30
【问题描述】:
我正在使用 bluebird.js promise 和 sequelize.js 来模拟我网站上的交易。 基本上我尝试在 processTransactions 中做一些事情,如果一切正常,我将 t.commit() 事务,否则我将 t.rollback() 事务。
另外,我正在使用 bluebird.js 承诺进行控制流。这是代码:
var processTransactions = function(transactionmain, transactionlist, t){
// code to process transactions
};
var processtransaction = function(transaction_id) {
// t need to be passed in so we can choose
// t.commit() or t.rollback() the transaction
sequelize.transaction(function(t){
return Promise.resolve({}).bind({transactionmain: [...], transactionlist: [...]})
.then(function(){
return [this.transactionmain, this.transactionlist, t];
})
.spread(processTransactions)
.then(function(){
t.commit().success(function() {})
})
.catch(function(err){
t.rollback().success(function() {})
});
}).error(function(err){
t.rollback().success(function() {})
});
};
我的问题是,如果我不将 t 参数传递给 processTransactions 那么函数可以执行但不能实现原子性。如果我通过了 t 那么程序就会停在那里。
有人知道发生了什么吗?谢谢。
【问题讨论】:
-
您是说简单地传递
t会导致问题还是取决于t在processTransactions()中的使用方式? -
我不知道你认为
this在then中的设置是什么(在this.trasnactiondomain中),但这没有任何意义。试试Promise.resolve().bind(this).then(... -
@Roamer-1888 是的,当我通过 t 然后程序停在那里。
-
@BenjaminGruenbaum 你说得对,我确实将某些东西与承诺绑定在一起。
-
我不确定我是否能很好地理解您的问题 - 如果您的代码被卡住,那么要么承诺无法解决,要么您有竞争条件。请考虑从以前从未见过您的代码的人的角度重新阅读您的问题 - 我很难理解具体是什么问题。
标签: node.js transactions promise sequelize.js bluebird