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

标签 javascript angularjs promise

用例

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

当前实现

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

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

想法

这就是我的想法,但我不知道在 resolve 中返回什么?如果我返回结果,路由将改变并传递一个空数组。

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 签名 然后我们的想法是让 Controller 拥有这个签名:

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

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

通过返回 $promise?

最佳答案

您可以使用 $q.all 返回一个 promise 数组

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

关于javascript - 从 AngularJS 中的两个资源调用返回 $promise 以延迟路由更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23432938/

相关文章:

c# - SignalR 不在服务器上调用方法

javascript - 返回空洞的 promise

javascript - 我可以在 Javascript 中创建自己的 "then()"函数并执行它吗?

node.js - Node UnhandledPromiseRejectionWarning

javascript - Javascript 如何处理将 setInterval() 分配给变量?

c# - Javascript var 作为 c# mvc3 razor 中的参数

javascript - 我希望在 Chrome 客户端存储大量数据,我有哪些选择?

javascript - 使用javascript更改图像src

angularjs - Angular 过滤器和 Angular2 管道之间的区别?

angularjs - ng 网格高度,以 % 为单位。 100% 的父容器