我正在努力将承诺与“dtaDashboard”'使用获取的仪表板中的值来执行第二次调用。出于某种原因,承诺链似乎并未在“解决方案”中起作用。为什么不呢?
state('uploadServiceTxData', {
url: '/dashboard/:id/upload',
templateUrl: 'views/dashboard-upload.html',
controller: 'DashboardUploadController',
resolve: {
dtaRefData: function(RefDataService) {
return RefDataService.getRefData();
},
dtaDashboard: function(DashboardService, $stateParams) {
return DashboardService.get({ id: $stateParams.id });
},
dtaUploads: function(TransactionSummaryUploadService, dtaDashboard, $q) {
return dtaDashboard.then(function(dashboard) { return TransactionSummaryUploadService.findByExample({ service: dashboard.service.name }) });
}
}
});
有关上述代码的更多信息。 DashboardSerivce和TransactionSummaryUploadService上的函数使用$ resource实现。所以"得到"和" findByExample"使用$ resource进行REST调用。
答案 0 :(得分:2)
你非常接近。
dtaDashboard
在注入datUploads
时已经解决了。所以你使用已解决的结果(意味着它不再是一个承诺)。
state('uploadServiceTxData', {
url: '/dashboard/:id/upload',
templateUrl: 'views/dashboard-upload.html',
controller: 'DashboardUploadController',
resolve: {
dtaRefData: function(RefDataService) {
return RefDataService.getRefData();
},
dtaDashboard: function(DashboardService, $stateParams) {
return DashboardService.get({ id: $stateParams.id });
},
dtaUploads: function(TransactionSummaryUploadService, dtaDashboard, $q) {
return TransactionSummaryUploadService.findByExample({ service: dtaDashboard.service.name });
}
}
});
答案 1 :(得分:0)
它不起作用的原因是服务是用$ resource实现的。 $ resource的方法不返回promises,它们返回一个包含promise的对象,以及其他一些东西。为了达到承诺本身,我需要使用dtaDashboard。$ promise。
所以这样的代码可以工作:
dtaDashboard: function(DashboardService, $stateParams) {
return DashboardService.get({ id: $stateParams.id });
},
dtaUploads: function(dtaDashboard) {
dtaDashboard.$promise.then(function(result) { ... /* result contains the data now. */ });
}
返回DashboardService.get({id:$ stateParams.id});
不从$ resource服务返回promise,它返回一个包含promise(最终是数据)的对象;该对象已解决,但不是它包含的承诺。为了确保路由解析为数据,可以改为:
dtaDashboard: function(DashboardService, $stateParams) {
return DashboardService.get({ id: $stateParams.id }).$promise;
}
现在dtaDashboard将完全解析为注入的数据。