使用 restangular promises 在 angularJS 中创建服务
creating a service in angularJS, using restangular promises
好吧,这让我发疯,基本上我想做的是创建一个服务来获取和评估用户能力,我正在使用 WP REST API。我使用 restangular 获取我的 JSON 数据。
在这个阶段,我正在控制器本身测试功能,但无论我在哪里测试它,无论是在我的自定义服务中使用 this.method 还是在控制器内部,使用或不使用 $scope结果始终未定义。我知道我在函数内部返回 true 或 false 的方式中遗漏了一些东西,或者在 JS 中的承诺方面有一些根本不同的东西。这是代码:
var current_user = parseInt(o2_i18n.user_id),
currentUserCapabilities,
capability;
$scope.currentUserCan = function(capability) {
if(current_user !== '0') {
wpAPIResource.one('users').get()
.then(function(allUsers){
for (var i = 0; i < allUsers.length; i++) {
if ( allUsers[i].id === current_user ) {
var currentUserCapabilities = allUsers[i].capabilities;
for(var prop in currentUserCapabilities){
if (capability === prop) {
//$log.log( prop );
return prop;
} else {
//$log.log( prop );
return false;
}
}
}
}
}, function(reason){
$log.error(reason);
});
} else {
//The user is not logged in, therefor no capabilities
return false;
}
};
$log.log($scope.currentUserCan('publish_posts'));
if ( $scope.currentUserCan('publish_posts') ) {
$log.log( 'Yes I Can!' );
} else {
$log.warn('No Can\'t Do!');
}
如果 current_user !== '0'
,您的 currentUserCan
函数不会 return 任何东西。例如,您应该 return 一个承诺(对于以下内容,您需要注入 $q
服务)
$scope.currentUserCan = function(capability) {
if(current_user !== '0') {
// note the "return" here
return wpAPIResource.one('users').get().then(function(allUsers){
for (var i = 0; i < allUsers.length; i++) {
if ( allUsers[i].id === current_user ) {
var currentUserCapabilities = allUsers[i].capabilities;
for(var prop in currentUserCapabilities){
if (capability === prop) {
return prop;
}
}
}
}
return false;
}, function(reason){
$log.error(reason);
return $q.reject(reason); // you still want the promise to fail
});
} else {
return $q.resolve(false);
// this turns the static value into a promise so the API for this
// function is consistent
}
};
然后像这样使用函数
$scope.currentUserCan('publish_posts').then(function(can) {
if (can) {
$log.log('Yes I Can!');
} else {
$log.warn("No Can't Do!");
}
});
我也稍微清理了你的循环。在您的 OP 中,如果在 allUsers
数组中找不到用户,则内部循环没有任何意义,并且您没有 return
值。
好吧,这让我发疯,基本上我想做的是创建一个服务来获取和评估用户能力,我正在使用 WP REST API。我使用 restangular 获取我的 JSON 数据。
在这个阶段,我正在控制器本身测试功能,但无论我在哪里测试它,无论是在我的自定义服务中使用 this.method 还是在控制器内部,使用或不使用 $scope结果始终未定义。我知道我在函数内部返回 true 或 false 的方式中遗漏了一些东西,或者在 JS 中的承诺方面有一些根本不同的东西。这是代码:
var current_user = parseInt(o2_i18n.user_id),
currentUserCapabilities,
capability;
$scope.currentUserCan = function(capability) {
if(current_user !== '0') {
wpAPIResource.one('users').get()
.then(function(allUsers){
for (var i = 0; i < allUsers.length; i++) {
if ( allUsers[i].id === current_user ) {
var currentUserCapabilities = allUsers[i].capabilities;
for(var prop in currentUserCapabilities){
if (capability === prop) {
//$log.log( prop );
return prop;
} else {
//$log.log( prop );
return false;
}
}
}
}
}, function(reason){
$log.error(reason);
});
} else {
//The user is not logged in, therefor no capabilities
return false;
}
};
$log.log($scope.currentUserCan('publish_posts'));
if ( $scope.currentUserCan('publish_posts') ) {
$log.log( 'Yes I Can!' );
} else {
$log.warn('No Can\'t Do!');
}
如果 current_user !== '0'
,您的 currentUserCan
函数不会 return 任何东西。例如,您应该 return 一个承诺(对于以下内容,您需要注入 $q
服务)
$scope.currentUserCan = function(capability) {
if(current_user !== '0') {
// note the "return" here
return wpAPIResource.one('users').get().then(function(allUsers){
for (var i = 0; i < allUsers.length; i++) {
if ( allUsers[i].id === current_user ) {
var currentUserCapabilities = allUsers[i].capabilities;
for(var prop in currentUserCapabilities){
if (capability === prop) {
return prop;
}
}
}
}
return false;
}, function(reason){
$log.error(reason);
return $q.reject(reason); // you still want the promise to fail
});
} else {
return $q.resolve(false);
// this turns the static value into a promise so the API for this
// function is consistent
}
};
然后像这样使用函数
$scope.currentUserCan('publish_posts').then(function(can) {
if (can) {
$log.log('Yes I Can!');
} else {
$log.warn("No Can't Do!");
}
});
我也稍微清理了你的循环。在您的 OP 中,如果在 allUsers
数组中找不到用户,则内部循环没有任何意义,并且您没有 return
值。