2014-10-18 47 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