2017-02-04 14 views
0

私は、HTTPリクエストでデータを取得するサービスを作成しています。Angularサービスは処理されたデータまたは生データを返しますか?

app.controller('WarriorsCtrl', function($scope, warriorService) { 
    warriorService.getWarriors(function(warriors){ 
    $scope.warriors = warriors; 
    }); 
}); 

app.factory('warriorService', function($http) { 
    var getWarriors = function(callbackFn) { 
    $http.get('/api/warriors').success(function(data) { 
     callbackFn(data); 
    }); 
    }; 

    return { 
    getWarriors: getWarriors 
    }; 
}); 

コントローラは、いくつかの処理された形式で「戦士」を必要とする場合には、サービス自体の処理を行うことをお勧めですか?

例:

var getWarriors = function(callbackFn) { 
    $http.get('/api/warriors').success(function(data) { 
     var processedWarriors = processData(data);  
     callbackFn(processedWarriors); 
    }); 
}; 

またはそのようなフィルタとしての生データを返すと、どこか別の処理を行うためにサービスを利用する方が良いでしょうか?

+2

これは、「あなたが常にべき」か「あなたはいけ」単純明快に答えることができるものではありません...これは、データが使用されているどのくらいに応じて異なりますものですデータの処理方法、データの量、アプリ設計自体の中核を占めるその他のものは約100万点です。 – Claies

+0

何かのために生データを必要とするかどうか尋ねてください。あなたがしなければ、答えは明らかです。そして、はい、それは約束を使うべきであり、答えが説明するように、「成功」を使うべきではありません。 – estus

答えて

0
It is a good practice to do the processing in the service itself 
Avoid using filters for scanning all properties of a complex object graph. 
Use filters for select properties,as Filters can easily be abused and negatively effect performance if not used wisely, for example when a filter hits a large and deep object graph. 
2

AngularJS $ httpサービスは、Callback Hellを避けることを約束しています。

コールバックを避け、代わりに約束を返し、必要に応じて.thenメソッドを使用してデータを処理します。成功ハンドラに値を戻すことにより

app.factory('warriorService', function($http) { 
    var getWarriors = function() { 
    //vvvv RETURN promise 
    return $http.get('/api/warriors').then(function onSuccess(response) { 
     var data = response.data; 
     var warriors = fn(data); 
     return warriors; 
    }); 
    }; 

    return { 
    getWarriors: getWarriors 
    }; 
}); 

.then方法は、処理された値を解決する新しい派生約束を作成します。コントローラで

:コールバック地獄を回避することに加えて

app.controller('WarriorsCtrl', function($scope, warriorService) { 
    warriorService.getWarriors 
    .then (function(warriors){ 
     $scope.warriors = warriors; 
    }).catch(function(errorResponse) { 
     console.log(errorResponse.status); 
     //throw to chain rejection 
     throw errorResponse; 
    }); 
}); 

、約束は、後で簡単に使用することができるエラー情報を保持します。

約束の.thenメソッドを呼び出すと、新しい派生約束が返されるため、約束の連鎖を簡単に作成することができます。任意の長さのチェーンを作成することは可能であり、約束は別の約束(それ以上解決を延期する)で解決することができるので、チェーンの任意のポイントで約束を一時停止/延期することが可能です。これにより、強力なAPIを実装することが可能になります。

-- AngularJS $q Service API Reference - Chaining Promises

+0

あなたの答えには多くの良い点があります。自分の例に基づいてサービス自体で処理を行うことが望ましいと仮定することはできますか? – Epsilon

関連する問題