为什么我不能在路由 'resolve' 中链接承诺?
Why can I not chain promises in a route 'resolve'?
我正在尝试链接获取 'dtaDashboard' 的承诺,以使用获取的仪表板中的值来执行第二个调用。出于某种原因,承诺链似乎无法在 'resolve' 内工作。为什么不呢?
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 实现的。所以 "get" 和 "findByExample" 使用 $resource 进行 REST 调用。
你们很亲近。
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 });
}
}
});
它不起作用的原因是服务是用 $resource 实现的。 $resource 的方法不 return promises,它们 return 一个包含 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. */ });
}
return DashboardService.get({ id: $stateParams.id });
不是来自 $resource 服务的 return 承诺,它 return 是一个包含承诺(最终是数据)的对象;该对象已解决,但不是它包含的承诺。为确保路由解析为数据,可以改为这样做:
dtaDashboard: function(DashboardService, $stateParams) {
return DashboardService.get({ id: $stateParams.id }).$promise;
}
现在 dtaDashboard 将完全解析为注入的数据。
我正在尝试链接获取 'dtaDashboard' 的承诺,以使用获取的仪表板中的值来执行第二个调用。出于某种原因,承诺链似乎无法在 'resolve' 内工作。为什么不呢?
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 实现的。所以 "get" 和 "findByExample" 使用 $resource 进行 REST 调用。
你们很亲近。
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 });
}
}
});
它不起作用的原因是服务是用 $resource 实现的。 $resource 的方法不 return promises,它们 return 一个包含 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. */ });
}
return DashboardService.get({ id: $stateParams.id });
不是来自 $resource 服务的 return 承诺,它 return 是一个包含承诺(最终是数据)的对象;该对象已解决,但不是它包含的承诺。为确保路由解析为数据,可以改为这样做:
dtaDashboard: function(DashboardService, $stateParams) {
return DashboardService.get({ id: $stateParams.id }).$promise;
}
现在 dtaDashboard 将完全解析为注入的数据。