返回值一旦$资源承诺解决
问题描述:
我有这样的工作代码:
服务(厂):
myApp.factory('MyService', ['$q','$resource', 'MyResource',
function ($q, $resource, MyResource) {
return {
getRoles: function() {
return MyResource.getRoles(); //MyResource makes API calls using $resource
} } });
控制器:
$scope.Roles = MyService.getRoles();
$scope.Roles.$promise.then(function() { $scope.RolesCount = $scope.Roles.length; });
我想什么要做的是在MyService中创建这样的函数,一旦getRoles被解析,将返回多个角色,这样我就可以像这样在控制器中使用它:
$scope.RolesCount = MyService.getRolesCount();
,然后在HTML
{{RolesCount}}
不幸的是,我不知道如何做到这一点,因为我getRolesCount()方法需要返回的东西,所以我不能用$ promise.then()内为MyService 。我会尝试更新我的问题的标题,一旦我想出更准确的东西。
答
如果需要在服务中转换服务器响应,那么应该将then
移动到那里。但是,如果then
应该展开承诺并为范围指定一个值,如上面的代码,这是不实际或不可行的。
$reaource
返回一个填充承诺分辨率的对象。资源应该用于视图的方式是:
{{Roles.length}}
更新对象时,它也将在视图中更新。将该值分配给另一个变量效率不高。
这是不可能做这样的事情
$scope.RolesCount = MyService.getRolesCount();
因为getRolesCount
是异步的,并与解析值是标量。可以使用`async..await(TypeScript或ES2017)将其压扁,但需要采取其他措施将控制流与AngularJS摘要同步,如this answer中所述。
您应该使用'actions'选项重新定义getRoles动作并提供transformResponse,就像这样。 – estus
Yeap,但它听起来像操纵资源/存储库层。如果我想处理服务层返回的数据(不是它用于什么?),然后将结果返回给控制器(作为对象引用与$ resource相同的方式)? – Kostrzak
是的,一个服务是比较合适的地方。但在你的情况下,这些方法都不起作用,因为'那么'不仅仅是转换响应,而是解开它的价值。而且,你并不需要用资源来做到这一点。 – estus