2016-07-11 136 views
3

我有一個AngularJS應用程序,我有service s調用$http資源並返回我在控制器中解決promise。下面是我在做什麼的樣本: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

[。然後] (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(); else 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

非常有說服力!謝啦。 :) –