Рекомендуемая угловая практика для $ http в контроллере или сервисе

0

Я напоминаю, что много раз на стеке переполняла рекомендацию делегировать угловые $ http-вызовы сервисам, а не делать это в контроллерах. Я вижу чистоту этого, когда кто-то хочет, чтобы служба каким-то образом модифицировала объект ответа, прежде чем передать его обратно контроллеру.

Однако, если нет необходимости изменять ответ? Кажется излишним использовать функцию в контроллере для вызова службы для возврата $ http-запроса в этом случае. Есть ли еще одна причина, по которой я мог бы узнать о том, чтобы зарезервировать $ http-вызовы для сервисов, а не контроллеров?

например

// in controller

function potatoChipTime() {
    chip = chipService.getAPotatoChip();
}


// in service (inject $q and $http)

var service = {
    getAPotatoChip: getAPotatoChip
}

return service;

function getAPotatoChip() {
    var deferred = $q.defer();
    $http.get(url)
        .success(function(response) {
            deferred.resolve(response);
        )}.error(function(error) {
            deferred.reject(error)
        });
    return deferred.promise;
}


// redundant, no? a lot of fuss to get a potato chip?
Теги:
controller
service

1 ответ

0
Лучший ответ

Я с тобой согласен. Обычно я только добавляю такой код в службу, если служба повторно используется в нескольких контроллерах, и если она делает больше, чем просто делает HTTP-запрос.

Обратите внимание, что ваш код обслуживания не использует цепочку обещаний и, таким образом, использует анти-шаблон. Все, что вам нужно, это

function getAPotatoChip() {
    return $http.get(url).then(function(response) {
        return response.data;
    }).catch(function(response) {
        return $q.reject(response.data);
    });
}

или, если вам все равно, отклонено ли обещание с данными или с полным ответом в случае ошибки:

function getAPotatoChip() {
    return $http.get(url).then(function(response) {
        return response.data;
    });
}
  • 0
    Спасибо! Поэтому, если бы я использовал функцию для вызова той, которую вы предоставили, если данные были возвращены из функции catch, вызывающая функция не узнает, чтобы отличить ее от правильного ответа, верно? Я думаю, что попробовал это однажды, и вот что случилось. Вот что вы имеете в виду под «обещанием анти-паттерна»?
  • 0
    Да, это так, потому что функция catch возвращает отклоненное обещание. Первый фрагмент соответствует вашему.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню