Я использую обещания bluebird.js и secleize.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()
? - person Roamer-1888   schedule 10.12.2014this
вthen
(вthis.trasnactiondomain
), но это ничего не значит. ПопробуйтеPromise.resolve().bind(this).then(...
- person Benjamin Gruenbaum   schedule 10.12.2014... .spread(function(transactionmain, transactionlist) { /* code to process transactions */ }). ...
, тоt
не нужно было бы передавать - он будет доступен из замыкания, сформированного внешней функцией. Предлагаем вам попробовать это, хотя бы для диагностики. Если это все еще не работает, вы должны подозревать код транзакций процесса. - person Roamer-1888   schedule 11.12.2014