如何避免在Sequelize的afterCommit中吊起?

时间:2019-09-06 09:49:37

标签: javascript sequelize.js

我在事务中使用 Sequelize ,并且还钩住了插入和删除命令。 挂钩工作正常,但是在执行挂钩函数期间,我使用afterCommit向事务添加了回调。

我对每个钩子执行此操作,因此对于每个插入或删除操作。 之所以这样做,是因为仅在执行提交后才需要使用数据。

因此,基本上,通常的流程是:

  1. 插入->挂钩函数->将回调cb添加到afterCommit
  2. 插入->挂钩函数->将回调cb添加到afterCommit
  3. 删除->挂钩函数->将回调cb添加到afterCommit
  4. 提交->执行afterCommit 1->执行afterCommit 2->执行afterCommit 3

因此,如第4步所示,一旦提交,就有3个对象函数排队运行。

问题是输入数据(键/值对象)完全相同,这可能是由于提升所致。

我尝试了多种方法来解决此问题,但无法使其正常工作。 当我尝试简单的测试来复制它时,它运行良好,因此我认为问题出在afterCommit实现及其处理数据的方式上。

关于如何进行这项工作的任何想法?

//Hook function
var hookFunction = function(obj, options){  
    //Getting the data that was inserted in the table     
    var dataValues = obj.dataValues;    

    //check if the command was executed in a transaction
    if(options && options.transaction) {    
        //create the function to run after the commit   
        var cb = (res) => {         
            //use the same data as input to create the same object in a different table with the same structure
            return otherModel.create(dataValues);
        }

        //queue the function to the transaction
        options.transaction.afterCommit(cb);    
    }
    else 
        //if not in a transaction, simply create the object
        return otherModel.create(dataValues);           
}

//Add hook to model
model.addHook('afterCreate', hookFunction);
model.addHook('afterDestroy', hookFunction);

0 个答案:

没有答案