将错误信息从服务发送到控制器

时间:2016-01-20 15:49:46

标签: angularjs

我有以下Angular服务:

function postService($http, $log, settings) {
  return {
    get: function (pageNumber, pageSize) {    
      return $http.get(
        "/api/posts",
        { params: { pageNumber: pageNumber, pageSize: pageSize } }
      ).then(function (response) {
        return response.data;
      }, function (response) {
        $log.error("Service Error");
        return "Service Error";
      });
    }
  }
}

当一切正常时我返回数据......但是当出现错误时我希望控制器知道它,以便它可以显示例如消息。

然后控制器是:

function PostListController($timeout, settings, postService) {

  var vm = this;
  vm.posts = [];
  vm.pagination = { pageNumber: 1, pageSize: 4 };

  vm.load(1, 4);

  vm.load = function (pageNumber, pageSize) {

    postService.get(pageNumber, pageSize)
      .then(function (data) {
        console.log("Controller Success");
        vm.posts = data;
      }, function (error) {
        console.log("Controller Error");
        console.log(error);
      });
  };
}

当我模拟我在控制台上看到的服务上的错误时:

"Server Error"
"Controller Success"

什么时候应该是这样的:

"Server Error"
"Controller Error"

我错过了什么?

更新

我应该提供以下服务吗?

function postService($http, $log, settings) {
  return {
    get: function (pageNumber, pageSize) {    
      return $http.get(
        "/api/posts",
        { params: { pageNumber: pageNumber, pageSize: pageSize } }
      );
    }
  }
}

如果发生这种情况,让控制器处理数据或错误?

到那时我正在以这种方式做事John Pappa Style指南: https://github.com/johnpapa/angular-styleguide#separate-data-calls

在这种情况下,服务会处理它......但是如果发生这种情况,它不会返回任何错误。

1 个答案:

答案 0 :(得分:1)

您应该考虑使用$q承诺并创建拒绝原因。

  

$ q.reject(原因)。创建一个以指定原因解析为已拒绝的承诺。

function postService($http, $log, settings, $q) {
  return {
    get: function (pageNumber, pageSize) {    
      return $http.get(
        "/api/posts",
        { params: { pageNumber: pageNumber, pageSize: pageSize } }
      ).then(function (response) {
        return response.data;
      }, function (response) {
        $log.error("Service Error");
        return ($q.reject("Service Error"));
      });
    }
  }
}

作为回应,您更新了问题:

你曾提到它是一种风格指南。因此,这是个人偏好。就个人而言,我想处理服务和控制器方面的错误。

原因:

  1. 我可以在调用此服务时发送相同的错误消息并出现错误。我不需要在使用此服务时将其写入每个控制器。记住Angular服务是单身。
  2. 我可以在错误传递给控制器​​之前处理服务端的错误。当您遇到在生成控制器之前需要为路径加载某些数据的问题时,这非常有用:解决问题的 ui-route 的典型用法。