Ember.js 如何从这个承诺层返回布尔值?

Ember.js 如何从这个承诺层返回布尔值?,ember.js,rsvp.js,Ember.js,Rsvp.js,我有一个控制器方法,它接受一个字符串参数,所以我可以测试用户是否有能力。用户有许多角色,这些角色附带了一系列权限,我们需要检查它是否包含该功能。我知道这太冗长了,但为了理解,我把它留了下来。稍后将进行重构 App.WorkspaceIndexController = Ember.Controller.extend({ userCan: function(capability) { var userHasCapability = false; var userPro

我有一个控制器方法,它接受一个字符串参数,所以我可以测试用户是否有能力。用户有许多角色,这些角色附带了一系列权限,我们需要检查它是否包含该功能。我知道这太冗长了,但为了理解,我把它留了下来。稍后将进行重构

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属性,或者我是否应该执行其他操作来返回值?

基本类型(如bool、int、string等)被复制,而不是引用。这意味着您返回
userhascability
,并且立即返回值false,在该承诺的范围内设置
userhascability
,并不意味着将返回该值。事实上不会

此外,真正的回应需要以承诺的形式出现,无论谁打电话给它,都需要以承诺的形式出现

下面是操作顺序,假设
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

    },
    ...
});
角色是一个承诺这一事实意味着任何试图使用它的人都需要得到一个承诺(或者不使用异步,也不使用承诺)


那太棒了。Sure帮助我了解承诺链是如何构建的。嵌入式记录是承诺吗?角色始终嵌入到用户模型中。我不知道为什么每次都是一个承诺。嵌入的记录不应该已经存在了吗?如果不是,我如何才能在不使用承诺的情况下获取这些记录。嵌入式记录并不定义某个东西是否是承诺,实际上定义它的是
async:true
。您的属性仍然是这样定义的:
roles:DS.hasMany('role'),
?是的。我想async默认为true?我是在灰烬数据测试版9上。因此,如果我将其设置为{async:false},应该可以了?经过一点修改后,我不知道如何同步获取角色。我总是需要得到用户,用户返回一个承诺,然后得到角色。从这个意义上讲,userCan()不总是可以的吗?
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;
      });
    }
});