javascript - Angular 最佳实践 : promise in a Factory or in a Controller?

标签 javascript angularjs promise

我的应用程序中有一个处理 API 调用的基本工厂。目前我正在使用以下表格:

.factory('apiFactory', function($http){

  var url = 'http://192.168.22.8:8001/api/v1/';

  return {
    getReports: function() {
      return $http.get(url+'reports').then(function(result) {
        return result;
      });
    },
    getReport: function(id) {
      return $http.get(url+'report/'+id).then(function(result) {
        return result;
      });
    }
  }
})

在我的 Controller 中,我是这样处理 promise 的:

.controller('exampleController', function($scope, apiFactory) {

      apiFactory.getReports().then(
        function(answer) {
          if (answer.status==200){
            if (answer.data.status == "error"){
              // DISPLAY ERROR MESSAGE
              console.log(answer.data.msg);
            }
          } else{
            // THROW error
            console.log('error: ', answer);
          }
        },
        function(error){
          console.log('error: ', answer);
        }
      );
    }
  }
})

似乎我可以将 promise 处理移至我的工厂,而不是在我的 Controller 中进行,但我不确定除了较小的 Controller 之外是否还有其他好处。

有人可以解释有关此模式的最佳实践吗?

最佳答案

最终由您决定要向服务调用方提供多少数据。如果需要,您绝对可以将 HTTP 响应对象返回给调用者,并让他们处理响应(顺便说一句,如果 promise 得到解决而不是拒绝,则响应始终是 HTTP 2xx)。

但是如果你想将调用者与数据到达那里的细节隔离开来(可能是缓存的,或者通过另一种机制提供的),并且如果你需要对数据进行后处理,那么建议处理服务中的响应。

这是一个例子:

.factory("apiService", function($http, $q){
  var url = 'http://192.168.22.8:8001/api/v1/';

  return {
    getReports: function() {
      return $http.get(url+'reports').then(function(result) {
        var data = result.data;

        if (data === "something I don't accept"){
           return $q.reject("Invalid data");
        }

        var processedData = processData(data);
        return processedData;
      })
      .catch(function(err){
         // for example, "re-throw" to "hide" HTTP specifics
         return $q.reject("Data not available");
      })
    },
    // same idea for getReport
  }
});

那么 Controller 就不需要关心底层机制——它得到的只是数据或拒绝。

.controller('exampleController', function($scope, apiService) {
   apiService.getReports()
     .then(function(reports){
        $scope.reports = reports; // actual reports data
     });
})

题外话:

请注意我是如何将服务名称从 "apiFactory" 更改为 "apiService" 的。我想指出这一点以消除可能的误解。无论您使用 .factory 还是 .service 还是 .value 您作为注入(inject)剂获得的始终是一个服务 实例。 .factory 只是一种如何实例化此服务的机制,因此 “apiFactory” 这个名称用词不当。此处唯一的“工厂”是您使用 .factory 注册的函数(当然可以是匿名的):

.factory("fooSvc", function fooSvcFactory(){
   return {
      getFoo: function(){...}
   }
})

关于javascript - Angular 最佳实践 : promise in a Factory or in a Controller?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30051412/

相关文章:

php - 无需刷新页面即可获取复选框值

javascript - JavaScript 中 setTimeOut() 函数的意外行为

javascript - AngularJS 模块中的多重配置

javascript - 使用 Angular 和 jquery 将文本颜色更改为特定字符

javascript - 我们如何在 Node.js 中使用 Promise?

来自 python 的 javascript 可读的 json

javascript - 如何使用切换来对状态使用react?

javascript - nggrid - 错误 : [$injector:unpr] Unknown provider: GridServiceProvider <- GridService <- HomeController

javascript - 从异步函数返回解析值

javascript - 为什么以及何时使用 Promise.resolve?