1

现在我有一个chartModelService用这个方法命名的 Angular 服务:

this.fetchChartModel = function() {
    return $http.get(fullUrlPath);
};

我有一个使用这些数据的 Angular 控制器:

chartModelService.fetchChartModel().then(function(rawData) {
    var chartData = chartModelService.translate(rawData);
    $scope.populateChart(chartData);
});

我想使用该服务在chartModelService.translate(data)内部chartModelService而不是控制器中执行。换句话说,我想将控制器更改为下面的代码,chartData它接收到的代码已经被翻译:

chartModelService.fetchChartModel().then(function(chartData) {
    $scope.populateChart(chartData);
});

我该如何更改才能在返回承诺的数据之前chartModelService.fetchChartModel()执行?translate()

4

3 回答 3

3

改变这个:

this.fetchChartModel = function() {
    return $http.get(fullUrlPath);
};

对此:

this.fetchChartModel = function() {
    var defObj = $q.defer();

    var fetch = $http.get(fullUrlPath);
    fetch.then(function(data){
        defObj.resolve(chartModelService.translate(data));
    });

    return defObj.promise;
};

(当然,在您的服务中使用适当的 DI)

这将初始化数据获取并在完成时返回一个包含翻译数据的承诺。

于 2014-05-19T20:13:09.087 回答
0

只需移动您的代码;)

this.fetchChartModel = function() {
    return $http.get(fullUrlPath)
    .then(function(rawData) {
        return $q.resolve(chartModelService.translate(rawData);)
    });
};

应该这样做只是确保您在依赖项中包含 $q 服务

于 2014-05-19T20:12:04.437 回答
0

对我来说,$q.resolve 不起作用,但你可以改用 $q.when

this.fetchChartModel = function() {
    return $http.get(fullUrlPath)
    .then(function(rawData) {
        return $q.when(chartModelService.translate(rawData));
    });
};
于 2016-10-20T15:46:02.927 回答