2016-11-11 6 views
-1

トランザクションのSequelize docsから得た以下の例では、クエリとトランザクション後処理メソッドのreturn文を追加する必要がある理由がわかりません。関数内の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チェーンの中で何かを持っている場合。チェーンを拡張したい場合は、約束を返すのはあなたの責任です。これは、約束に基づく設計の基本原則の1つです。

ここで、トランザクションコードはトランザクションをいつコミットできるかを知る必要があります。そのブロックの中で約束を返さなければ、その挿入操作が完了するまでにどれくらいの時間がかかるかを待つことになります。これは非同期コードの性質です。レベル間を調整する必要があります。

のような状況で値を返すことを忘れてしまった場合は、予期せぬ動作をして、混乱の原因となる微妙なエラーが発生する可能性があります。適切な約束が何であるかを目で確認することをお勧めします。returnステートメントはチェーン内に存在する必要があり、間違いが明らかになるようにコードを構成する必要があります。

+0

hmm私は、あなたが言っていることを理解しているかどうかわからない、私は最初のものと無関係と思われるので投稿した2番目の例を取り除くつもりです – lboyel

+1

約束を「返す」ことができないと約束チェーンは、待っている。あなたが何かを返すなら、それは待つ義務があります。 – tadman