原始类型(例如 bool、int、string 等)是复制的,而不是引用的。这意味着你回来了userHasCapability
,并且立即返回值 false,设置userHasCapability
在该承诺的范围内,并不意味着它会被退回。事实上它不会。
此外,真正的响应需要采用承诺的形式,无论谁调用它,都需要以这种形式使用它。
这是操作顺序,假设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
},
...
});
事实上,角色是一个承诺,这意味着任何尝试使用它的人都需要期待一个承诺的结果(或者不要使用异步,也不要使用承诺)
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;
});
}
});