为什么我不能在一条路线中将承诺联系起来'解决问题?

时间:2015-10-13 13:49:39

标签: angularjs promise angular-routing

我正在努力将承诺与“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调用。

2 个答案:

答案 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将完全解析为注入的数据。