【问题标题】:Return value from service once $resource promise is resolved解决 $resource 承诺后从服务返回值
【发布时间】:2018-03-15 22:24:00
【问题描述】:

我有这样的工作代码:

服务(工厂?):

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() 方法需要返回一些东西,所以我不能在 MyService 中使用 $promise.then()。一旦我想出更准确的内容,我会尝试更新我的问题标题。

【问题讨论】:

  • 您应该使用actions 选项重新定义getRoles 操作并提供像这样的transformResponse。
  • 是的,但这听起来像是在资源/存储库层上进行操作。如果我想在服务层处理返回的数据(这不是它的用途吗?)然后将结果返回给控制器(作为对象引用与 $resource 相同的方式)怎么办?
  • 是的,一个服务比较合适的地方。但在您的情况下,这些方法都不起作用,因为then 不仅会转换响应,还会解开其值。此外,您实际上并不需要使用资源来执行此操作。

标签: angularjs angular-promise ngresource angularjs-ng-resource


【解决方案1】:

如果需要在服务中转换服务器响应,则应将then 移到那里。但是,如果 then 应该像上面的代码那样解开一个承诺并为范围分配一个值,那么这是不切实际的或不可能的。

$resource 返回一个在承诺解决时填充的对象。资源应该在视图中使用的方式是:

{{Roles.length}}

当一个对象被更新时,它也会在视图中更新。将值分配给另一个变量是低效的。

这样的事情是不可能的

$scope.RolesCount = MyService.getRolesCount();

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

【讨论】:

    猜你喜欢
    • 2019-10-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多