Angular承诺:拦截“然后”

Angular promise: intercept "then"

本文关键字:然后 拦截 承诺 Angular      更新时间:2023-09-26

现在我有一个名为chartModelService的Angular服务,上面有这个方法:

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

我有一个Angular控制器来消耗这些数据:

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

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

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

我如何改变chartModelService.fetchChartModel(),使它在返回承诺的数据之前执行translate() ?

修改如下:

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)

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

移动你的代码;)

this.fetchChartModel = function() {
    return $http.get(fullUrlPath)
    .then(function(rawData) {
        return $q.resolve(chartModelService.translate(rawData);)
    });
};
只要确保你的dependencies中包含了$q service

对我来说没有工作$q。解析,但是当

时可以使用$q.
this.fetchChartModel = function() {
    return $http.get(fullUrlPath)
    .then(function(rawData) {
        return $q.when(chartModelService.translate(rawData));
    });
};