2016-11-11 80 views
-1

在下面的例子中,我从Sequelize docs获得了关于事务的文档,我不明白你为什么必须为查询添加return语句,以及在sequelize事务方法中。函数中的返回语句

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 
     }); 
    } 

回答

2

如果你在你的承诺then链的东西,不返回任何东西那么它的推测方法没有做任何事情是这样的链的一部分。如果你想扩展这个链条,那么你有责任返回一个承诺。这是承诺驱动设计的基本原则之一。

在这里,事务代码需要知道它何时可以提交事务。如果您没有在该块内返回承诺,那么在这些插入操作在接近完成的任何地方之前很久就会关闭它。这是异步代码的本质。你需要协调不同层次。

如果你忘了在你这样的代码威力工作情况返回值,但它也将行为异常,引入细微的错误长此下去,可能会导致混乱。开发一个适当的承诺看起来像是一个好主意,并且应该为链中的任何内容提供陈述,并且组织代码以使错误显而易见。

+0

嗯我不知道我明白你在说什么,我将删除我发布的第二个示例,因为它与第一个似乎无关 – lboyel

+1

未能“返回”承诺意味着承诺链可以自由地继续前进等候。如果你做*返回一些东西,那么它有义务等待。 – tadman