Я постараюсь подвести итоги обсуждения и рассказать о некоторых способах устранения дублирования:
Прежде всего, ваш второй подход - правильное направление для повторного использования функции в ваших контроллерах.
Классический подход был бы следующим:
return {
getNames: getNames
}
.controller('NameController', function NameController(
HttpService) {
var ctrl = this;
HttpService.getNames().then(function(res) { ctrl.names = res; } );
})
Обратите внимание, что вы можете даже извлечь это больше, если все ваши вызовы имеют одинаковый формат, например, вы могли бы:
// utility function that loads something into your controller
var load = function(request, ctrl, prop) {
request.then(function(res) { ctrl[prop] = res; }
};
// this way you can have many of requests with minimal code
load(HttpService.getNames, ctrl, 'names');
load(HttpService.getBooks, ctrl, 'books');
load(HttpService.getThings, ctrl, 'things');
...
В качестве альтернативы, если вы можете использовать ES2017 в своем проекте (например, ваш код переносится), вы можете упростить использование некоторых новых функций без необходимости в дополнительной функции:
// Using promise all will assure these are all fetched asynchronously in respect to one another
Promise.all([
async () => ctrl.names = await HttpService.getNames(),
async () => ctrl.books = await HttpService.getBooks(),
async () => ctrl.things = await HttpService.getThings()
]);
Наконец, вы можете захотетьпараметризовать ваш запрос так, чтобы у вас был только один:
// Get all
function getAll(what) {
return $http.get('/data/' + what).then(success, error)
}
Тогда вам не нужно иметь разные методы для каждого типа, вы просто сделаете:
getAll('names');
getAll('books');
...