从AngularJS中的两个资源调用返回$ promise以延迟路由更改

时间:2014-05-02 16:34:36

标签: javascript angularjs promise

使用案例

使用路由提供程序,在解析中返回$ promise将避免在加载UI后弹出数据。但是,我在处理两个不同的资源调用并将其作为单个数组返回时遇到问题。

当前实施

当前的实现有效,但要求控制器需要两个资源。

var app = angular.module('app', []);

app.config(function($routeProvider) {
  $routeProvider
    .when('/resource/:id', {
      templateUrl: 'partials/resource.html',
      controller: ResourceController,
      resolve: {
        parentResource: function($route, SingleResource) {
          return SingleResource.get({ id: $route.current.params.id }).$promise;
        },
        childResources: function($route, ChildResource) {
          return ChildResource.get({ id: $route.current.params.id }).$promise;
        }
      }
  });
 });

但是,我要做的是为ResourceController提供一个数组Resource,该数组是由parentResourcechildResource组成的数组,其中第0项在数组中是parentResource

这就是我的想法,但我不知道该如何回归?如果我返回结果,路径将改变并传递一个空数组。

var app = angular.module('app', []);

app.config(function($routeProvider) {
  $routeProvider
    .when('/resource/:id', {
      templateUrl: 'partials/resource.html',
      controller: ResourceController,
      resolve: {
        Resource: function($route, SingleResource) {
          var resources = [];
          SingleResource.get({ id: $route.current.params.id })
            .$promise.then(function(parent)
                             { resources.splice(0, 0, parent); })
                     .catch(function(error) { alert('error!'); })
          ChildResource.get({ id: $route.current.params.id })
            .$promise.then(function(children) 
                             { resources = resources .concat(children); })
                     .catch(function(error) { alert('error!'); })

          return ???? // Can I return a $promise here?
        }
      }
  });
});

问题

如何从中获取ResourceController签名 然后我们的想法是让控制器拥有这个签名:

var ResourceController = function($scope, parentResource, childResources) { ... }

var ResourceController = function($scope, resources) { ... }

通过返回$ promise?

2 个答案:

答案 0 :(得分:4)

您可以使用$ q.all返回承诺数组

var resources = [];

resources.push(SingleResource.get({ id: $route.current.params.id }).$promise);
resources.push(ChildResource.get({ id: $route.current.params.id }).$promise);

return $q.all(resources) // You return an array of promises

答案 1 :(得分:-1)

尝试使用

 resolve: {
                parentResource: function($route, SingleResource) {
                  return SingleResource.get({ id: $route.current.params.id }).$promise;
                },
                childResources: function($route, ChildResource,  parentResource) {
                  return  (parentResource.length > 0) ? ChildResource.get({ id: $route.current.params.id }).$promise : [];
                }
              }

https://medium.com/opinionated-angularjs/a2fcbf874a1c