如何将错误处理与控制器和服务集成

时间:2016-10-13 15:34:35

标签: javascript angularjs

请参阅下面我的角度应用程序的结构:

我有一个名为'firm.html'的页面,其中包含一个按钮。单击此按钮将执行以下代码。

控制器

控制器调用服务功能。在{ng-show中使用generationInProgress变量来切换HTML页面上加载gif的可见性

    $scope.generationInProgress = true;

    firmService.processFirm(firmRequest).then(function(response) {      

        window.location.href = "firm/process";          
        $scope.generationInProgress = false;

    });

公司服务

这是一个使用上面提到的以下函数处理Firm操作的服务

this.processFirm = function(firmRequest) {      
    return httpService.put('firm/process', firmRequest);
};

HTTP服务

这是一项处理所有服务调用的服务。它由多个服务使用,包括上面的firmService。以下是上面提到的put方法

this.put = function(url, data) {

    return promise = $http.post(url, data).success(function(response) { 
        return response;
    }).error(function(response) {
        console.log("error");
    });

};

如果服务器返回HTTP错误代码,显然会执行.error函数。如果我有专门的错误页面,我可以重定向到该页面。

但是,我需要在'firm.html'页面上显示错误,同时将$scope.generationInProgress设置为false,以便不再显示加载的gif。执行此操作的代码都不能位于httpService中,因为它是许多不同组件使用的常用服务。

我不确定如何将错误传播回控制器以实现此目的。我只是将return response;放在.success.error中,并在控制器中使用IF语句来测试HTTP代码吗?有替代方法吗?

感谢任何建议。

2 个答案:

答案 0 :(得分:1)

已弃用.success.error方法。相反,请使用.then.catch方法。

将成功的承诺return数据链接到.then方法。要链接被拒绝的承诺,throw错误响应:

this.put = function(url, data) {

    //Use .then method
    return promise = $http.post(url, data).then(function(response) {
        //return to chain success 
        return response;
    //Use .catch method
    }).catch(function(response) {
        console.log("error");
        //throw to chain rejection
        throw response;
    });

};

来自文档 1

  

弃用通知

     

已弃用$http遗留承诺方法.success.error。改为使用标准.then方法。

答案 1 :(得分:0)

您可以在控制器中处理被拒绝的状态,而不是在html中显示它。

$scope.generationInProgress = true;
$scope.error = "";

firmService.processFirm(firmRequest).then(function(response) {      
    window.location.href = "firm/process";          
    $scope.generationInProgress = false;

}, function(err) {
    $scope.generationInProgress = false;
    $scope.error = "Your customized error message. Caused by: " + err;
});