2016-07-11 18 views
3

のリソースが$httpのリソースを呼び出し、コントローラで解決するを返すAngularJSアプリケーションがあります。ここで私がやっているのサンプルです:AngularJSサービスと約束のベストプラクティス

app.service('Blog', function($http, $q) { 
    var deferred = $q.defer(); 
    $http.get('http://blog.com/sampleblog') 
    .then(function(res) { 
     // data massaging stuffs 
     return deferred.resolve(res.data); 
    }, function(err) { 
     // may be some error message checking and beautifying error message 
     return deferred.reject(err); 
    }); 
    // chain if further more HTTP calls 
    return deferred.promise; 
}); 

をしかし、私は単純にも、次の行うことができます:

app.service('Blog', function($http) { 
    return $http.get('http://blog.com/sampleblog'); 
}); 

をそして時の検証、エラー美化、約束を連鎖などを行いますcontrollerレベル。

私の質問は:コード復元力と柔軟性という点で「ベストプラクティス」と見なされますか?それとも、これとは全く違うやり方があるのでしょうか?

+2

はIMOあなたが別のコントローラからサービスを使用することができますので、あなたがコードを複製していないこのように、サービス中などの検証、エラー美化、連鎖する約束を、残した方が良いです – rpadovani

+2

[.then] (https://docs.angularjs.org/api/ng/service/$q#the-promise-api)は新しい約束を返しますので、 '$ q'サービスを明示的に使用する必要はありません。同じこと。 –

+0

@ProfessorAllmanデータマッサージロジックがあればどうしますか?同様に '$ scope.post = someMethod(res.data [0]);'または '$ scope.error = if(res.err.details.code === 400)doThis();を実行すると良いと考えられます。他にdoThat(); ' –

答えて

5

MVCの背後にあるコンセプトによれば、コントローラは約束をどうするかを決めるべきです。

サービスは約束を開始する必要があります。

app.service('Blog', function($http) { 
    return $http.get('http://blog.com/sampleblog'); 
}); 

コントローラは解決時に何をすべきかを決定する必要があります。

$scope.response = Blog; 

$scope.response.then(function(response) { 
    DataProcessor.processData(response.data) 
}) 
.error(function(error){ 
    ErrorHandler.handle(error); 
}) 
+1

私はそれを取るでしょう。 'DataProcessor'と' ErrorHandler'のコンセプトをどのように導入したかを気に入った。十分に公正である:) –

+1

@PrashantGhimireこのアプローチの実用性は(私が他の人から学んだことですが)、コントローラがプロセスを開始し、さまざまなフラグを設定できることがわかります。次に、応答が到着したときに何をすべきかを決定することができます。非常に具体的に要求されていない限り、サービス内でこれを梱包するべきではありません。良い質問;) –

+0

非常に説得力のある!ありがとう。 :) –

関連する問題