2016-11-11 76 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