Javascript 什么';这两种服务声明方法的区别是什么?

Javascript 什么';这两种服务声明方法的区别是什么?,javascript,angularjs,frontend,angularjs-service,Javascript,Angularjs,Frontend,Angularjs Service,声明服务的最佳方式是什么我发现了这两种不同的方式我似乎看不出其中的区别: 第一种方法: angular.module('app', []) .factory('Data', ['$http',function($http){ return { get: function(fileName,callback){ $http.get(fileName). success(function(data, statu

声明服务的最佳方式是什么我发现了这两种不同的方式我似乎看不出其中的区别: 第一种方法:

angular.module('app', [])
   .factory('Data', ['$http',function($http){
     return {
         get: function(fileName,callback){
              $http.get(fileName).
              success(function(data, status) {
                  callback(data);
              });
         }
     };
   }]);
第二种方法:

angular.module('app', [])
   .factory('Data', ['$http', function($http){
     var Url   = "data.json";
     var Data = $http.get(Url).then(function(response){
       return response.data;
     });
     return Data;
   }]);
哪一个更好,为什么?
提前谢谢

后者需要预先了解url和回调函数。后者允许您同时设置目标url和回调,这要灵活得多。我建议在大多数情况下使用前者,但这实际上取决于您正在尝试做什么。

第一个示例使服务用户明确了解HTTP请求的异步性,我认为这比向服务用户提供承诺对象(第二个示例中的“数据”更可取)并允许用户继续执行其命令式操作,这可能取决于尚未填写的“数据”对象。

第二种方法比较详细,但一个主要好处是能够创建私有属性/方法,并且只返回公共对象

请注意,这应该围绕测试等进行规划-根据个人经验,角度、私人方法和属性更难进行单元测试等

例如:

angular.module('app', [])
   .factory('Data', ['$http', function($http){
        var private = {
            property: 100,
            method: function(data) {
                return data * 2;
            }
        };
        var public = {
            property: true,
            property_two: false,
            method: function(data) {
                return private.method(data + private.property);
            }
        };
        return public;
   }]);

这里有一些东西需要分开

目标vs承诺

服务是单例的,所以在第二种方法中(只返回承诺),您的数据将永远不会被更新。这通常是期望的结果。在第一个方法中,每次都会调用fresh(尽管
$http
有一个
缓存
选项)

在我看来,只有在存在多个方法(例如,
get
create
delete
等)或需要多次调用时,才会返回服务对象。否则,我们只是在积木上堆积

承诺vs回调

承诺是了不起的,我们应该利用它们。传入回调很好,但也很有限。通过承诺,我们可以轻松地将其链接在一起,例如:

Data.get()
.然后(massageDataFn)
.然后(第二次按摩fn)
.then(功能(数据){
$scope.items=数据;
});
此外,
$http
已经返回了一个承诺。为什么把它扔掉

方法参数

前一个(对象方法)接受了一些参数。虽然我担心控制器传入URL,但在某些情况下这是可取的。但只需返回函数而不是对象即可:

.factory('Data',['$http',function($http){
返回函数(文件名、回调){
//$http呼叫此处。。。
};
}]);
然后,只有考虑对象与承诺,如上所述

结论


如果您的服务有一个API,则返回一个带有公共API方法的对象,其中每个方法都返回一个承诺。如果您的服务只是获取一些数据一次,那么只需返回承诺并完成它。

尽管第一种方法也不阻止您声明私有成员(在
返回
语句之前)。正确,我认为我的示例不够具体。如果您在声明之前返回,您将无法引用该对象的属性-即
public.myproperty
。因此,如果我想执行CRUD服务,第一种方法将是更好的选择?@YahyaKACEM绝对!因为我不经常使用
ngResource
,所以我会通过这样做来“假装”。谢谢,我会这样做的。