这种服务声明方法有什么区别?

Yah*_*CEM 3 javascript frontend angularjs angularjs-service

什么是宣布服务的最佳方式我发现这2种不同的方式我似乎无法看出差异:第一种方法:

angular.module('app', [])
   .factory('Data', ['$http',function($http){
     return {
         get: function(fileName,callback){
              $http.get(fileName).
              success(function(data, status) {
                  callback(data);
              });
         }
     };
   }]);
Run Code Online (Sandbox Code Playgroud)

第二种方法:

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;
   }]);
Run Code Online (Sandbox Code Playgroud)

哪一个更好,为什么?提前致谢.

Jos*_*ler 5

这里有几点要分开.

对象与承诺

服务是单件,所以在第二种方法(仅返回承诺)中,您的数据将永远不会再次更新.这通常是理想的结果.在您的第一种方法中,每次都会调用它(尽管$http有一个cache选项).

从我的角度来看,一个只会返回一个服务对象,如果有多种方法(例如get,create,delete等),或者需要进行多次调用.否则,我们只是在堆积如山.

承诺与回调

承诺很棒 - 我们应该利用它们.传递回调很好,但它也非常有限.有了承诺,我们可以轻松地将它们链接在一起,例如:

Data.get()
.then( massageDataFn )
.then( secondMassageFn )
.then(function ( data ) {
  $scope.items = data;
});
Run Code Online (Sandbox Code Playgroud)

此外,$http已经回复了一个承诺.为什么扔掉它?

方法参数

你以前的(对象方法)接受了一些参数.虽然我对传入URL的控制器持谨慎态度,但在某些情况下这是可取的.但是你可以做到这一点返回一个函数,而不是一个对象:

.factory( 'Data', [ '$http', function ( $http ) {
  return function ( fileName, callback ) {
    // $http call here...
  };
}]);
Run Code Online (Sandbox Code Playgroud)

然后只考虑对象与承诺,如上所述.

结论

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