Как создать службу, которая одновременно возвращает обещание и предоставляет набор функций?

Предположим, у меня есть простой сервис:

angular.module('myModule')
    .factory('myService', ['$http', function($http) {
        return $http.get('/something');
    }]);

Теперь всякий раз, когда я ввожу службу в контроллер, маршрутизатор ждет разрешения обещания, прежде чем изменить маршрут, что именно то, что я хочу.

Однако, похоже, нет способа вернуть другие данные из службы. Что, если службе необходимо также предоставить некоторые методы? Как я могу сделать это, сохраняя поведение зависимости, описанное выше?


person Nathan Osman    schedule 07.03.2016    source источник


Ответы (1)


Вы можете использовать реализацию Angular для шаблона обещания $q, чтобы создать обещание, которое будет разрешено, когда будет разрешено $http.get, и разрешить основное с данными, поступающими из вашего HTTP-ресурса, а также другими данными и функциями:

  angular.module('myModule')
  .factory('myService', ['$http', '$q',
    function($http, $q) {
      var deferred = $q.defer();

      $http.get('/something').then(function(data) {
        deferred.resolve({
          data: data,
          doStuff: function() {}
        });
      });

      return deferred.promise;
    }
  ]);

Кстати, я не уверен, что результат какого-то HTTP-запроса вообще является службой. Похоже, весь GET должен быть инкапсулирован функцией вашего myService сервиса, и вызывать его в каком-то контроллере, сервисе, директиве или где вам нужно его вызывать, и вместо этого предоставить продолжение с .then.

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

person Matías Fidemraizer    schedule 07.03.2016
comment
Спасибо. Что касается запроса GET, он извлекает некоторые данные, которые нужны службе при ее первом запуске. - person Nathan Osman; 07.03.2016
comment
@NathanOsman Ну, в общих чертах, я дал вам хороший совет о том, как вы решите свою проблему. Прочитайте мой обновленный ответ, где я предоставил вам еще больше информации. - person Matías Fidemraizer; 07.03.2016