2014-10-18 34 views
13

過去3天我一直在我的頭上貼牆。承諾與承諾連線水線電話

我正在使用sailsjs &綁定的水線ORM。我想要一個接一個地運行數據庫調用。我知道我可以通過嵌入「然後」調用來實現這一點,但它看起來錯了。

我已經經由Q文檔和教程幾次,但我還是不明白如何連接和火「然後」從現有承諾依次:(

調用我想:

  1. 創建一個用戶
  2. 創建一個動作
  3. 鏈接的用戶&動作
  4. 更新用戶
  5. 更新動作

我的代碼看起來像

var mail = '[email protected]'; 

Users.create({email:mail, name:''}).then(console.log).fail(console.log); 

Actions.create({actionID:123}) 
.then(function(error, action){ 
     Users.findOneByEmail(mail).then(function(person){ 
      person.actions.add(action.id); 
      person.save(console.log); 
     }).fail(console.log) 
    }); 

Users.update({email:mail},{name:'Brian'}).exec(console.log); 
Actions.update({actionID:123},{now:'running'}).exec(console.log); 

你可以從我一直在使用EXEC &的混合,然後代碼中看到的:P

我的思維方式就是連接 Users.create(...),然後 - > Action.create(...),然後 - > Users.findOneByEmail(...),然後 - > *和更新。

從任何幫助

回答

13

一天的研究後,所以巨大的感謝。我想我已經破解了它。

注:我的工作得到了第一個版本有「那麼」 S內襯式(除去金字塔厄運的)通過返回的創建。這讓我可以打電話到下一行來發起創作。 http://documentup.com/kriskowal/q/#tutorial/chaining

這是我的最終版本

var mail = '[email protected]';  

Users.Create({email:mail,name:''}) 
    .then(function(user){ 
    return [Actions.create({actionID:123}),user]; 
    }).spread(function(action, user){ 

    user.action.add(action.id); 
    user.name = 'Brian'; 
    user.save(); 

    action.now = 'running'; 
    action.save(); 
    }).catch(console.error); 

其中一個很酷的事情是「傳播」,可以讓你行了「承諾」和「價值觀」是返回一個他們都已經完成進入下一個「那麼」。

+0

你的'失敗'不會工作,更喜歡'catch'。除了那些好的工作! – 2014-10-19 16:42:00

+0

謝謝@BenjaminGruenbaum 我不知道我是否需要最後完成()或然後()例如'})。然後()。失敗('。會這樣嗎? 或交換失敗(...) (...)是什麼意思? – codemeasandwich 2014-10-20 08:37:09

+0

同樣在http://documentup.com/kriskowal/q/#tutorial第一個例子有'catch(...)。done();'爲什麼我們需要最後的**完成**? – codemeasandwich 2014-10-20 08:50:03