如何从这个承诺的蛋糕中返回布尔值? [英] How do I return the boolean value from this layer-cake of promises?
问题描述
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屋!