2017-02-04 2 views
0

Я пишу службу для получения некоторых данных через HTTP-запрос.Должен ли Угловой сервис возвращать обработанные данные или необработанные данные?

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 использует обещания, чтобы избежать 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; 
    }); 
}); 

В дополнение к избежать обратного вызова ад, обещание сохраняет информацию об ошибках, которые могут быть легко использоваться в дальнейшем.

Поскольку вызов метода обещания возвращает новое производное обещание, легко создать цепочку обещаний. Можно создавать цепочки любой длины, и поскольку обещание может быть разрешено с помощью другого обещания (которое отложит дальнейшее его разрешение), можно приостановить/отложить разрешение обещаний в любой точке цепи. Это позволяет реализовать мощные API.

-- AngularJS $q Service API Reference - Chaining Promises

+0

Много хорошего в вашем ответе. Могу ли я предположить, что предпочтительнее выполнять обработку в самой службе на основе вашего примера? – Epsilon

Смежные вопросы