Node.js Bluebird promise和Sequelize模拟事务原子性

Node.js Bluebird promise和Sequelize模拟事务原子性,node.js,transactions,promise,sequelize.js,bluebird,Node.js,Transactions,Promise,Sequelize.js,Bluebird,我正在使用bluebird.js promise和sequelize.js模拟我网站上的交易。 基本上,我尝试在processTransactions中执行一些操作,如果一切正常,我将t.commit()事务,否则我将t.rollback()事务 此外,我正在使用bluebird.js promise执行控制流。代码如下: var processTransactions = function(transactionmain, transactionlist, t){ // code to

我正在使用bluebird.js promise和sequelize.js模拟我网站上的交易。 基本上,我尝试在processTransactions中执行一些操作,如果一切正常,我将t.commit()事务,否则我将t.rollback()事务

此外,我正在使用bluebird.js promise执行控制流。代码如下:

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,程序就停止了


有人知道发生了什么吗?谢谢。

我想我在这里找到了答案。。。


我认为错误是因为交易不是承诺,所以承诺不能正确工作。如果我使用bluebird promisify事务函数,那么它就会工作

你是说简单地传递
t
会引起问题,还是取决于
processTransactions()
中如何使用
t
?我不知道你认为
这个
中设置为
,然后在那里(在
这个.trasnactiondomain
),但它没有什么意义。尝试
Promise.resolve().bind(这个)。然后(…<代码> > RoAM-1888:是的,当我通过T时,程序就停在那里。“BenjaminGruenbaum,你说得对。我确实把一些事情与诺言挂钩了。我不确定我对你的问题了解得很好。如果你的代码被卡住了,那么要么你的承诺没有解决,要么你有竞争的条件。请考虑从问题的角度重新阅读你的问题。以前从未见过您的代码的人—我很难理解问题的具体原因。