如何从这层蛋糕承诺中返回布尔值?

时间:2014-09-11 19:32:34

标签: ember.js rsvp.js

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

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属性不正确,或者我还应该做些什么来返回值?

1 个答案:

答案 0 :(得分:3)

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

此外,真正的回应需要以承诺的形式出现,而且任何人都需要以这种形式使用它。

以下是操作顺序,假设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;
      });
    }
});