返回值一旦$资源承诺解决

返回值一旦$资源承诺解决

问题描述:

我有这样的工作代码:

服务(厂):

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 。我会尝试更新我的问题的标题,一旦我想出更准确的东西。

+0

您应该使用'actions'选项重新定义getRoles动作并提供transformResponse,就像这样。 – estus

+0

Yeap,但它听起来像操纵资源/存储库层。如果我想处理服务层返回的数据(不是它用于什么?),然后将结果返回给控制器(作为对象引用与$ resource相同的方式)? – Kostrzak

+0

是的,一个服务是比较合适的地方。但在你的情况下,这些方法都不起作用,因为'那么'不仅仅是转换响应,而是解开它的价值。而且,你并不需要用资源来做到这一点。 – estus

如果需要在服务中转换服务器响应,那么应该将then移动到那里。但是,如果then应该展开承诺并为范围指定一个值,如上面的代码,这是不实际或不可行的。

$reaource返回一个填充承诺分辨率的对象。资源应该用于视图的方式是:

{{Roles.length}} 

更新对象时,它也将在视图中更新。将该值分配给另一个变量效率不高。

这是不可能做这样的事情

$scope.RolesCount = MyService.getRolesCount(); 

因为getRolesCount是异步的,并与解析值是标量。可以使用`async..await(TypeScript或ES2017)将其压扁,但需要采取其他措施将控制流与AngularJS摘要同步,如this answer中所述。