2016-11-11 1 views
-1

트랜잭션의 Sequelize docs에서 얻은 아래 예제에서 쿼리에 대한 return 문과 sequelize transaction 메서드를 추가해야하는 이유를 알지 못합니다.함수의 return 문

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 체인에 뭔가가있는 경우. 체인을 연장하려면 약속을 지키는 것이 귀하의 책임입니다. 이것은 약속 중심 디자인의 기본 원칙 중 하나입니다.

여기서 트랜잭션 코드는 트랜잭션을 커밋 할 수있는시기를 알아야합니다. 그 블럭 안의 약속을 반환하지 않는다면 삽입 작업이 완료되기 훨씬 오래 걸리기 전에 약속을 닫을 것입니다. 이것이 비동기 코드의 특성입니다. 레벨 사이를 조정해야합니다.

코드에서 코드를 반환하는 것을 잊어 버렸지 만 예상치 못한 동작을 일으키고 미묘한 오류가 발생하여 수정되지 않은 채로 남을 수 있습니다. 올바른 약속이 무엇인지 눈을 떼어 내고, return 문장이 체인에 존재해야하며 실수가 명확하도록 코드를 구성해야합니다.

+0

흠 나는 당신이 말하는 것을 이해하는지 모르겠다. 나는 첫 번째와 관계가없는 것처럼 보이기 때문에 게시 한 두 번째 예제를 제거 할 예정이다. – lboyel

+1

약속을 '반환'하지 못하면 약속 체인이없이 계속 진행할 수있다. 기다리는. 당신이 무언가를 돌려 준다면 기다려야 할 의무가 있습니다. – tadman