当前位置: 首页 > 面试题库 >

Angular最佳实践:在工厂还是在控制器中承诺?

濮阳宁
2023-03-14
问题内容

我的应用程序中有一个基本工厂,可以处理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('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处理移至Factory,而不是在控制器中执行,但是我不确定这是否会带来比小型控制器更多的好处。

有人可以解释有关此模式的最佳做法吗?


问题答案:

最终由您自己决定要向服务调用者提供多少数据。如果需要,您可以肯定地将HTTP响应对象返回给调用者,并让他们处理响应(顺便说一下,如果已解决而不是拒绝了诺言,则始终为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('exampleController', function($scope, apiService) {
   apiService.getReports()
     .then(function(reports){
        $scope.reports = reports; // actual reports data
     });
})

题外话:

注意如何将服务名称从更改"apiFactory""apiService"。我想指出这一点,以消除可能的误解。无论您使用.factory或者.service或者.value你可以注射什么始终是一个
服务 实例。.factory只是 如何
实例化此服务的机制,因此名称"apiFactory"不正确。这里唯一的“工厂”是您注册的功能.factory(当然可以是匿名的):

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


 类似资料:
  • 在我的Play web应用程序中,我使用的是从未来获取结果。有没有其他更好的方法(使用最佳实践)从数据库中获得结果?如果我使用或我的控制器完成执行,结果还不在中。下面是我的控制器方法。一切正常,但我需要在Scala中遵循更多的最佳实践。 编辑:我已经在使用。但在这个例子中,我不能使用,基本上是因为。我想在验证json之前,我需要一个来包围该方法的所有代码。 使用平面地图和map的新方法。我的问题是

  • 提交对映改动 一次提交要包括一个相关改动。例如,对于两个错误的修复应该进行两次不同的提交。精简的提交可以让其他的开发团队人员更简单地明白其改动的用义。如果其中一次提交的改动出现了问题,也可以方便地回滚到改动之前的状态。借助暂存功能来标记相关的改动文件,Git 可以为你打造出非常精准的提交。 频繁地提交改动 经常性地提交改动可以确保不会出现特别庞大的提交,同时也可以比较精准地对应到所需要的改动上。此

  • 问题内容: 试图找到构建Angular App的“最佳”方法,我发现了几篇最佳实践文章。通过此输入,我做到了: HTML模板就是这样: 所以我的问题是,是否应该将数据更改视为DOM操作?在控制器中执行此操作的当前版本对我来说似乎更实用(例如,设置默认值)。另外,如果我为此添加更多功能,则“指令链接”块将增加并且包含比定义更多的功能。我猜应该在指令中执行诸如更改颜色或根据范围数据隐藏元素之类的事情。

  • 问题内容: 这是一个现实的Angular问题,我无法解决。我喜欢Angular,但是这个问题现在困扰着我很多。 扩展现有控制器功能,并在应用程序的另一页上使用扩展控制器的最佳实践是什么?换句话说: 如何在Angular中继承控制器? 编辑 -2014年9月23日,不要以为我的原始用例的描述会帮助访问者更好地理解我在这里的用意。我认为这使人们偏离了真正的问题。 问题答案: 半年后,我想我完全了解发生

  • CRUD代表创建,读取,更新,删除。这是四种方法(如果区分查看一个记录和查看所有记录,则是五种方法)。在Rails中,处理CRUD的规范方法似乎包括七种方法。例如,使用 速记法为Order对象创建路由会生成以下七条路由: 这就是我困惑的根源。为 和 设置单独的操作/路由有什么意义?使用单独的操作查看页面和在数据库中创建记录有什么好处?我理解它是如何在Rails中实现的,例如: 在使用Rails之前