【问题标题】:Chaining waterline calls with Promises使用 Promises 链接水线调用
【发布时间】:2014-12-13 19:30:24
【问题描述】:

在过去的 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);

从代码中可以看出,我一直在使用 exec & then 的组合:P

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

非常感谢任何帮助

【问题讨论】:

    标签: orm promise sails.js q waterline


    【解决方案1】:

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

    注意:我工作的第一个版本通过返回创建将“then”排成一行(删除 厄运金字塔)。这允许我在下一行调用 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);
    

    其中一个很酷的东西是“spread”,它允许您将“Promise”和“values”排列为返回一个它们都已完成的下一个“then”。

    【讨论】:

    • 您的fail 将无法使用,而是更喜欢catch。除了那份好工作!
    • 谢谢@BenjaminGruenbaum 我不知道我是否需要最后的 done() 或 then() 例如}).then().fail(。这会奏效吗?或者将 fail(...) 换成 catch(...) 是什么意思?
    • 还有documentup.com/kriskowal/q/#tutorial 第一个例子有catch(...).done(); 为什么我们需要最后的done
    • 你不需要 done With Bluebird 承诺。它是旧 Q 库的产物。
    • 很好的解决方案,很好地使用了.spread()。我还将返回从user.save()action.save() 返回的承诺,以防万一以后有人想取消此操作。所以return [user.save(), action.save()]
    猜你喜欢
    • 2018-11-07
    • 2018-07-05
    • 2015-06-23
    • 2014-10-17
    • 2017-05-09
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2016-12-16
    相关资源
    最近更新 更多