在AngularJS中,从两个资源调用中返回$promise来延迟路由更改
Returning a $promise from two resource calls in AngularJS to delay route change
用例
使用路由提供商,在解析中返回$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
,该数组是由parentResource
和childResource
组成的数组,其中数组中的项目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?
}
}
});
});
如何获取我的resourceconcontroller签名我们的想法是让控制器拥有这样的签名:
var ResourceController = function($scope, parentResource, childResources) { ... }
var ResourceController = function($scope, resources) { ... }
通过返回$promise?
您可以使用$q。返回一个承诺数组
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
试试like
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 相关文章:
- 如何从节点中的api promise返回对象
- 如何将从$promise返回的数据分配给全局变量
- Bluebird:运行promise返回函数序列
- 如何使用promise返回从递归AJAX调用构建的集合
- 如何正确编码promise返回函数
- 如何从Q节点promise返回变量
- 从Promise返回值
- Angularjs检查是否有2个promise返回
- Sequelize:如何访问[object Promise]或从Promise返回值
- 如何用chai断言从promise返回的json
- 将从节点promise返回的对象循环到下一个.then
- AngularJS异步请求方法服务使用promise返回数据
- 单元测试:在模拟promise返回来测试我的emit时遇到困难
- 从Promise返回值到Promise. all
- 为什么'new Promise(…)'返回& # 39;未定义# 39;
- AngularJS ajax http promise返回额外的数据
- AngularJS服务内部的promise返回值似乎会改变
- 定义一个NavigationInstruction,等待promise返回
- 如何使用promise返回数组的最终结果
- 在Promise返回函数中找到第一个成功