如何从这个承诺的蛋糕中返回布尔值? [英] How do I return the boolean value from this layer-cake of promises?

查看:121
本文介绍了如何从这个承诺的蛋糕中返回布尔值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  App.WorkspaceIndexController = Ember.Controller.extend({
userCan:function ){
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 (角色){
return role.get('workspace')=== self.get('workspace');
});
});

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

返回userHasCapability;

},
...
});

我遇到的问题是,如果用户有许可。这样每次都返回false。我设置userHasCapability属性是不正确的,还是还有其他的东西要返回值?

解决方案

因为bool,int,string等被复制,没有被引用。这意味着您返回 userHasCapability ,并且立即返回值false,在该承诺的范围内设置 userHasCapability 这意味着它会被归还。实际上它不会。



此外,真正的回应将需要以承诺的形式,而任何人称之为需要以该形式使用它



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

  App.WorkspaceIndexController = Ember.Controller.extend({
foo:function(){
var j = this.userCan('eat worms'); // 1.调用方法,6.将j设置为false,我们从foo
}中删除,
userCan:function (能力){
var userHasCapability = false;
var userPromise = this.get('session.user');

var rolesPromise = userPromise.then(function(user) {// 2. promise built
return user.get('roles'); // 7.这个承诺发生了解决
});

var filteredRolesPromise = rolesPromise。然后(function(roles){// 3.另一个promise build
return roles.filter(function (role){// 8 return the filter cause 7 resolved
return role.get('workspace')=== self.get('workspace');
});
});

filteredRolesPromise.then(function(filteredRoles){// 4.另一个承诺构建
返回filteredRoles.forEach(function(role){// 9.8解决了现在这样做,甚至虽然没有人再引用userHasCapability
userHasCapability = _.contains(_。flatten(role.get('permissions'),'name'),capability);
});
}) ;

return userHasCapability; // 5. false返回

},
...
});

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

  App.WorkspaceIndexController = Ember.Controller.extend {
foo:function(){
this.userCan('吃蠕虫')然后(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.这个承诺发生解决
});

var filteredRolesPromise = rolesPromise.then(function(roles){// 3.另一个承诺构建
返回roles.filter(function(role){// 8返回过滤器原因7已解决
return role.get('workspace') === self.get('workspace');
});
});

return filteredRolesPromise.then(function(filteredRoles){// 4.另一个承诺构建
filteredRoles.forEach(function(role){// 9.8解决了现在这样做,甚至虽然没有人再引用userHasCapability
userHasCapability = _.contains(_。flatten(role.get('permissions'),'name'),capabilities);
});
return userHasCapability ;
});
}
});


I've got a controller method that takes a string argument so I can test if a user has a capability. The user has many roles and the roles has an array of permissions attached that we need to check if it contains the capability. I know this is overly verbose, but for the sake of understanding, I've left it so. Will refactor later...

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;

    },
    ...
});

The problem I'm having, is that I need the method to return a boolean if the user has the permission. This returns false every time. Am I setting the userHasCapability property improperly, or is there something else I should be doing to return the value?

解决方案

Primitive types such as bool, int, string etc are copied, not referenced. This means you return userHasCapability, and the value false is returned immediately, setting userHasCapability within the scope of that promise, doesn't mean it will be returned. In fact it won't.

Additionally the real response will need to be in the form of a promise, and whomever calls it will need to use it in that form as well.

Here's the order of operations, assuming foo calls 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

    },
    ...
});

The fact that roles is a promise means anyone that tries to use it needs to expect a promise as a result (or don't use async, and don't use promises)

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;
      });
    }
});

这篇关于如何从这个承诺的蛋糕中返回布尔值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆