3

サービスを宣言する最良の方法は何ですか?この2つの異なる方法を見つけましたが、違いがわかりません:最初の方法:

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

2番目の方法:

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;
   }]);

どちらが優れているのか、その理由は? 前もって感謝します。

4

4 に答える 4

5

ここで分離することがいくつかあります。

オブジェクトと約束

サービスはシングルトンであるため、2 番目の方法 (promise だけを返す) では、データが再び更新されることはありません。多くの場合、それは望ましい結果です。最初の方法では、毎回新鮮に呼び出されます (ただし$httpcacheオプションがあります)。

私の見解では、複数のメソッド ( 、 、 など) があるか、複数回呼び出す必要がある場合にのみ、サービス オブジェクトをget返しcreateますdelete。そうでなければ、私たちは粗末に積み上げているだけです。

約束とコールバック

Promise はすばらしいものです。私たちはそれらを活用すべきです。コールバックを渡すのは良いことですが、非常に制限的でもあります。promise を使用すると、それらを簡単に連鎖させることができます。たとえば、次のようになります。

Data.get()
.then( massageDataFn )
.then( secondMassageFn )
.then(function ( data ) {
  $scope.items = data;
});

その上、$httpすでにプロミスを返します。なぜそれを捨てるのですか?

メソッドのパラメーター

前者 (オブジェクト メソッド) は、いくつかのパラメーターを取りました。コントローラーが URL を渡すことには警戒していますが、それが望ましい場合もありますただし、オブジェクトではなく関数を返すだけでこれを行うことができます。

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

そして、考慮すべき点は、上記で説明した Object vs Promise だけです。

結論

サービスに API がある場合は、パブリック API メソッドを含むオブジェクトを返します。これらのメソッドのそれぞれが promise を返します。サービスがデータを 1 回だけ取得する場合は、Promise を返すだけで完了します。

于 2013-03-05T21:18:37.790 に答える
0

後者は、URLコールバック関数の事前知識が必要です。後者では、ターゲット URLとコールバックの両方を設定できるため、はるかに柔軟です。ほとんどの場合、前者を使用することをお勧めしますが、実際には何をしようとしているのかによって異なります。

于 2013-03-05T21:09:43.443 に答える
0

最初のサンプルでは、​​HTTP リクエストの非同期性をサービス ユーザーに対して明示的にしています。これは、サービス ユーザーに promise オブジェクト (2 番目のサンプルでは "Data" がこれに相当します) を渡し、ユーザーに処理を続行させるよりも好ましいと思います。おそらくまだ入力されていない「データ」オブジェクトに依存する、その命令的な操作。

于 2013-03-05T21:10:30.680 に答える
0

2 番目の方法はもう少し冗長ですが、主な利点の 1 つは、プライベート プロパティ/メソッドを作成し、パブリック オブジェクトのみを返す機能です。

これは、テストなどに関して計画する必要があることに注意してください-Angularでの個人的な経験から、プライベートメソッドとプロパティは単体テストなどにより困難です.

例として:

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;
   }]);
于 2013-03-05T21:12:42.083 に答える