2017-02-04 57 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

這是不是可以用一個簡單的「你應該總是」或回答「你不應該」 ......這是一個將取決於有多少數據被使用的東西,需要處理的數據有多少種不同的方式,有多少數據以及構成應用設計本身核心的大約一百萬種其他信息。 – 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 Service使用promise來避免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

相關問題