链接水线呼叫与Promises

cod*_*ich 13 orm promise q sails.js waterline

在过去的3天里,我一直在我的头上撞墙.

我正在使用sailsjs和捆绑的水线ORM.我想一个接一个地运行数据库调用.我知道我可以通过嵌套"then"调用来做到这一点,但它只是看起来不对.

我已经多次查看了Q文档和教程,但我仍然没有得到如何连接并从现有的Promises中依次点击"then"调用:(

我想要:

  1. 创建用户
  2. 创造一个动作
  3. 链接用户和操作
  4. 更新用户
  5. 更新动作

我的代码看起来像

 var mail = 'test@test.com';

 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);
Run Code Online (Sandbox Code Playgroud)

正如你从代码中看到的那样,我一直在使用exec然后混合:P

我认为方法是连接Users.create(...).然后 - > Action.create(...).然后 - > Users.findOneByEmail(...).然后 - >*和更新.

非常感谢任何帮助

cod*_*ich 13

所以经过一天的研究.我想我已经破解了它.

注意:我工作的第一个版本通过返回创建了"then"的排列(删除了厄运金字塔).这允许我在下一行调用然后激活创建.http://documentup.com/kriskowal/q/#tutorial/chaining

这是我的最终版本

var mail = 'test@test.com';    

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);
Run Code Online (Sandbox Code Playgroud)

其中一个很酷的事情是"传播",可以让你行了"承诺"和"价值观"是一个回报他们都已经完成了进入下一个"然后".

  • 很好的解决方案,很好地使用`.spread()`.我还会返回从`user.save()`和`action.save()返回的promises,只是因为任何人都希望以后链接这个操作.所以`return [user.save(),action.save()]` (2认同)