为什么我不能在路由 '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 将完全解析为注入的数据。