2015-06-27 2 views
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? 

ответ

0

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

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

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, вызывающая функция не знала бы, чтобы отличить ее от правильного права ответа? Кажется, я однажды попробовал это, и вот что случилось. Это то, что вы подразумеваете под «обещанием анти-шаблона»? – claireablani

+0

Да, это было бы, потому что функция catch возвращает отклоненное обещание. Первый фрагмент эквивалентен вашему. –

+0

Так что мне пришло в голову, что, может быть, причина, по которой ваша функция $ http в службе вместо контроллера состоит в том, что десятки экземпляров контроллера могут быть созданы на странице, но служба создается только один раз? – claireablani

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