【问题标题】:How do I return the boolean value from this layer-cake of promises?如何从这个承诺层蛋糕中返回布尔值?
【发布时间】:2014-09-11 19:32:33
【问题描述】:

我有一个控制器方法,它接受一个字符串参数,所以我可以测试用户是否有能力。用户有许多角色,并且这些角色附加了一系列权限,我们需要检查它是否包含该功能。我知道这过于冗长,但为了理解起见,我已经离开了。稍后会重构...

App.WorkspaceIndexController = Ember.Controller.extend({
    userCan: function(capability) {
      var userHasCapability = false;
      var userPromise = this.get('session.user');

      var rolesPromise = userPromise.then( function(user) {
        return user.get('roles');
      });

      var filteredRolesPromise = rolesPromise.then(function (roles) {
        return roles.filter(function (role) {
          return role.get('workspace') === self.get('workspace');
        });
      });

      filteredRolesPromise.then(function (filteredRoles) {
        return filteredRoles.forEach(function (role) {
          userHasCapability = _.contains(_.flatten(role.get('permissions'), 'name'), capability);
        });
      });

      return userHasCapability;

    },
    ...
});

我遇到的问题是,如果用户拥有权限,我需要该方法返回布尔值。这每次都返回 false。我是否错误地设置了 userHasCapability 属性,或者我应该做些什么来返回值?

【问题讨论】:

    标签: ember.js rsvp.js


    【解决方案1】:

    原始类型,如 bool、int、string 等是复制的,而不是引用的。这意味着您返回userHasCapability,并且立即返回值false,将userHasCapability设置在该promise的范围内,并不意味着它会被返回。事实上不会。

    此外,真正的响应需要采用承诺的形式,并且任何调用它的人也需要以这种形式使用它。

    这是操作顺序,假设foo 调用userCan

    App.WorkspaceIndexController = Ember.Controller.extend({
        foo: function(){
          var j = this.userCan('eat worms');  // 1. method is called, 6. j is set to false, we fall out of foo
        },
        userCan: function(capability) {
          var userHasCapability = false;
          var userPromise = this.get('session.user');
    
          var rolesPromise = userPromise.then( function(user) { // 2. promise built
            return user.get('roles'); // 7. this promise happens is resolved
          });
    
          var filteredRolesPromise = rolesPromise.then(function (roles) { // 3. another promise built
            return roles.filter(function (role) { //8 return the filter cause 7 resolved
              return role.get('workspace') === self.get('workspace');
            });
          });
    
          filteredRolesPromise.then(function (filteredRoles) { // 4. another promise built
            return filteredRoles.forEach(function (role) {  //9. 8 resolved so do this now, even though no one references userHasCapability anymore
              userHasCapability = _.contains(_.flatten(role.get('permissions'), 'name'),  capability);
            });
          });
    
          return userHasCapability; // 5. false is returned
    
        },
        ...
    });
    

    角色是一个承诺这一事实意味着任何尝试使用它的人都需要期待一个承诺作为结果(或者不要使用异步,也不要使用承诺)

    App.WorkspaceIndexController = Ember.Controller.extend({
        foo: function(){
          this.userCan('eat worms').then(function(result){
            console.log(result);
          });
        },
        userCan: function(capability) {
          var userHasCapability = false;
          var userPromise = this.get('session.user');
    
          var rolesPromise = userPromise.then( function(user) { // 2. promise built
            return user.get('roles'); // 7. this promise happens is resolved
          });
    
          var filteredRolesPromise = rolesPromise.then(function (roles) { // 3. another promise built
            return roles.filter(function (role) { //8 return the filter cause 7 resolved
              return role.get('workspace') === self.get('workspace');
            });
          });
    
          return filteredRolesPromise.then(function (filteredRoles) { // 4. another promise built
            filteredRoles.forEach(function (role) {  //9. 8 resolved so do this now, even though no one references userHasCapability anymore
              userHasCapability = _.contains(_.flatten(role.get('permissions'), 'name'),  capability);
            });
            return userHasCapability;
          });
        }
    });
    

    【讨论】:

    • 这太棒了。当然可以帮助我理解承诺链是如何构建的。嵌入式记录是承诺吗?角色始终嵌入在用户模型中。我不确定为什么每次都返回一个承诺。嵌入式记录不应该已经存在吗?如果没有,我怎样才能在不使用 Promise 的情况下获取这些记录。
    • 嵌入记录并没有定义某事是否是一个承诺,实际上 async:true 是定义它的东西。
    • 你的属性还是这样定义的:roles: DS.hasMany('role'),?
    • 是的。我想 async 默认情况下是真的吗?我正在使用 ember-data beta 9。所以如果我将其设置为 {async: false},应该这样做吗?
    • 稍微修改后,我看不到如何同步获取角色。我总是必须得到返回一个承诺的用户,然后得到角色。从这个意义上说, userCan() 不是总是可以的吗?
    猜你喜欢
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多