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

Angular $ http vs服务vs ngResource

姚烨
2023-03-14
问题内容

我想了解使用简单的$
http请求到服务器和/或将该请求包装在服务中与使用ngResource对象(相对于RESTful资源而言不是显而易见的)相比的优缺点。

据我了解,$ http请求是低级别的,但非常灵活且可配置,而当处理RESTful API时,ngResource对象使通信非常简单。

我想我要问的是一个非常简单的情况,比如说从服务器中检索数据(对象数组的GET请求)相对于将其包装在服务中,仅使用$ http请求会更有效。
(应该总是这样吗?)还是使用ngResource对象?

这里的任何想法将不胜感激。例如,可以缓存$ http响应,可以使用ngResource吗?谢谢。


问题答案:

决定将其表达为答案,因为在评论中我们基本上得出了您想知道的内容:

使用$ http或$ resource仍然可以缓存结果,您指出了在问题中真正使用一个结果的原因。如果您具有RESTful接口,那么使用$
resource会更好,因为最终您将编写更少的RESTful接口通用的样板代码,如果您不使用RESTful服务,则$
http更有意义。您可以使用以下两种方法之一来缓存数据:http://www.pseudobry.com/power-up-http-with-
caching/

我认为将$ http或$
resource请求放入服务通常效果更好,因为您希望从多个位置访问数据,并且该服务充当一个单例对象。因此,基本上,您可以在此处处理任何类型的缓存,并且控制器都可以仅监视适当的服务来更新自己的数据。我发现控制器中的$
watch组合用于获取服务上的数据,并从服务的方法中返回承诺,这使我在如何更新控制器中的内容方面具有最大的灵活性。

我将这样的东西放入控制器中,并将exampleService注入到控制器定义的顶部。

angular.module("exampleApp", []).service('exampleService', ["$http", "$q" ,function ($http, $q) {
    var service = {
        returnedData: [],
        dataLoaded:{},
        getData = function(forceRefresh)
        {
            var deferred = $q.defer();

            if(!service.dataLoaded.genericData || forceRefresh)
            {
                $http.get("php/getSomeData.php").success(function(data){
                    //service.returnedData = data;
                    //As Mark mentions in the comments below the line above could be replaced by
                    angular.copy(data, service.returnedData);
                    //if the intention of the watch is just to update the data
                    //in which case the watch is unnecessary and data can
                    //be passed directly from the service to the controller
                    service.dataLoaded.genericData = true;
                    deferred.resolve(service.returnedData);
                });
            }
            else
            {
                deferred.resolve(service.returnedData);
            }

            return deferred.promise;
        },
        addSomeData:function(someDataToAdd)
        {
            $http.post("php/addSomeData.php", someDataToAdd).success(function(data){
                service.getData(true);
            });
        }
    };
    service.getData();
    return service;
}]).controller("ExampleCtrl", ["$scope", "exampleService", function($scope, exampleService){
  //$scope.$watch(function() {return exampleService.returnedData}, function(returnedData){
  //  $scope.myModel.someData = returnedData;
  //});
  //if not using angular.copy() in service just use watch above
  $scope.myModel.someData = exampleService.returnedData;
}]);

另外,这是Angular团队关于“最佳做法”的精彩视频,我仍在重新观看,并逐渐吸收。



 类似资料:
  • 如何自定义@角/服务工作者?我知道在npm_modules文件夹内修改是不合适的。我遇到了一个教程,作者创建了一个额外的2 js文件。其中一个文件包含服务工作人员代码,而另一个文件包含导入ngsw-worker.js文件和自定义服务工作人员文件的“导入脚本()”。它工作正常,自定义服务辅助角色监听安装事件,但是当涉及到读取事件时,它不会通过这个读取事件监听器。我没有得到这个函数里面的控制台。我不知

  • XMLHttpRequest无法加载http://localhost:6010/gettweets。请求的资源上没有“访问-控制-允许-来源”标头。因此,不允许访问源'http://localhost:4200'。error_handler.js:54异常:URL:null的状态为0的响应

  • 问题内容: 我有一个基类,我想在服务中进行扩展以帮助将数据输入角度范围。我已经在网上搜索了一种解决方案,但是没有找到我喜欢的解决方案。我有一个用于访问设备文件系统的基类 类结构: 我希望能够在几个不同的角度服务(即offlineCart,offlineCustomLists等)中扩展该类,其中每个服务都将能够使用存储库来存储各种不同的数据类型。我正在寻找最好,最合适的方式来做到这一点。在普通Jav

  • 问题内容: 最近,我和一些同事正在讨论AngularJS服务是否应具有状态。我们提出了一些反对和反对的论据,我想就此话题获得更多的想法和反馈。在我的搜索中,我发现了这一点,但似乎没有提及任何明确的最佳实践。在无客户端世界中,服务永远都不应保持状态,但是我开始认为它可能是客户端可以接受的,因为它是一个不同的问题。 服务保持状态的原因: 该服务不会被多个线程访问。每个浏览器都有其自己的服务实例。 允许

  • 使用RxJS和Angular 2处理服务器重新连接的最佳方法是什么? 控制台中的结果: 如果我把这行替换掉.. 与 ...ServiceOnline仅在http服务返回成功响应且当前联机状态为false(断开连接)时发出另一个值: 所以TakeTaile应该有效。我在这里误解/遗漏了什么? 我是RxJS的新手--任何关于改进这段代码中实现的其他指针也将非常感谢...

  • 我有一个链接生成器服务,它能够生成到特定内容类型的链接(用户的详细信息页面,内容项目的详细信息页面等)。 这个服务真的很好用,而且有同步功能: 现在,我必须为登录用户引入单独的路由,以便将更改为。 我需要添加到链接生成器服务中的唯一更改是检查并返回不同的路由URL。这不是一个问题,只要我的登录用户的信息将是同步可用的。但这不是... 我有一个返回一个承诺。第一次调用它时,它实际上发出了一个服务器请