Как интегрировать ресурс с двумя разными сервисами для запроса сервера с предоставленными им параметрами?

Я изучаю Angular, и мне не нравится мой нынешний подход. Текущий контроллер использует в первую очередь Geolocation обслуживание и когда getLocation() решен, то Pagination служба вызывается с параметром местоположения. Есть ли лучшее решение, чтобы предоставить один сервис, который сервер запросов с местоположением? Могу ли я интегрировать текущую логику и переместить или использовать Pagination Служба напрямую через почтовую фабрику и сервер запросов с параметрами данной страницы и местоположения после разрешения? Я хотел бы загрузить новые данные через вызов только одного метода ресурса, например, из функции loadPage(). Как я могу рефакторинг этого кода?

app.controller('MainCtrl',['$scope','Post','Pagination','Geolocation'
  ($scope, Post, Pagination, Geolocation) ->
    $scope.posts = []
    Geolocation.getLocation().then (location) ->
      Pagination.paginate $scope, Post, 10, (postsRes) ->
        $scope.posts.push posts for posts in postsRes
      , params: {location: location}
])

app.factory 'Post', ($resource) ->
  $resource '/posts/:id.json', { id: '@id' }

app.service "Geolocation", ['$q', '$window', ($q, $window) ->
  @getLocation = ->
    deferred = $q.defer()
    return deferred.resolve @loc if @loc
    if $window.navigator and $window.navigator.geolocation
      $window.navigator.geolocation.getCurrentPosition (position) ->
        @loc = position.coords
        deferred.resolve position.coords
    deferred.promise
]
app.service 'Pagination', ->
  @paginate = ($scope, @resource, @maxElemPerPage=10, @onNewPage, @query={}) ->
    @page = 1
    @canLoadNextPage = true
    $scope.loadPage = (promise) =>
      return promise.resolve() unless @canLoadNextPage
      @load promise

    @load = (promise) =>
      @canLoadNextPage = false
      q = angular.extend @query, page: @page
      @resource.query q, (resources) =>
        @canLoadNextPage = true if resources.length is @maxElemPerPage
        @page++
        @onNewPage resources if @onNewPage
        promise.resolve() if promise

    @load()
  @

1 ответ

Создайте единый сервис, который объединяет оба, пусть он создает свое собственное обещание, выполняет вызовы, объявляет обратные вызовы для обоих сервисов и возвращает обещание. Как только вторая служба вернется, разрешите свое обещание.

Другие вопросы по тегам