Как я могу получить доступ к переменным в различных функциях JavaScript на той же фабрике?

0

я пытаюсь создать приложение для подачи instagram с ионной каркасом, и я создал фабрику для обработки моих запросов html, поэтому я могу использовать их на своих контроллерах, то есть с помощью API instagram, это значение для json-массива, называемого next_url, которое мне нужно загрузите Старые фотографии/сообщения так: Это моя фабрика:

app.factory('PersonService', function($http){
var BASE_URL = "https://api.instagram.com/v1/tags/sometag/media/recent?access_token=+++";
var items = [];
var nextUrl = 0;

return {
  GetFeed: function(){
  return $http.get(BASE_URL+'&count=10').then(function(response){
    items = response.data.data;
    **nextUrl = response.data.pagination.next_url;**

    return items;

  });
},
GetNewPhotos: function(){
  return $http.get(BASE_URL+'&count=2').then(function(response){
    items = response.data.data;

    return items;
  });
},
GetOldPhotos: function(){
  return $http.get(**nextUrl**).then(function(response){
    items = response.data.data;
    return items;
  });
}
}
});

Я хочу использовать nextUrl = response.data.pagination.next_url; из функции GetFeed, чтобы получить next_url и использовать его в функции GetOldPhotos, которая будет использовать nextUrl для загрузки старых фотографий, я не думаю, что могу вернуть 2 значения из одной и той же функции, и я думаю, что $ scope не является опцией на фабрике.

Я знаю, что может быть более одного способа достичь этого, но я только начал с ионного, угловатого и javascript, и я действительно застрял здесь, и было бы здорово, если бы я мог получить некоторое "руководство": D Извините за любую грамматику, синтаксис или любая другая ошибка в этом посте и спасибо заранее!

Теги:
ionic-framework

2 ответа

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

Вы можете присвоить значение частным переменным на своем заводе, не возвращаясь.

var app = angular.module('test', []);

app.factory('PersonService', function($http) {
  var BASE_URL = "https://api.instagram.com/v1/tags/sometag/media/recent?access_token=+++";
  var items = [];
  var nextUrl = 0;

  return {
    GetFeed: function() {
      return $http.get1(BASE_URL + '&count=10').then(function(response) {
        items = response.data.data;
        nextUrl = response.data.pagination.next_url;
      });
    },
    GetNewPhotos: function() {
      return $http.get1(BASE_URL + '&count=2').then(function(response) {
        items = response.data.data;
      });
    },
    GetOldPhotos: function() {
      return $http.get1(nextUrl).then(function(response) {
        items = response.data.data;
      });
    }
  }
});

app.controller('Test', function($scope, $http, $q, $timeout, PersonService) {
  // DO NOT COPY
  // adding function in $http for demo purpose only
  $http.get1 = function(url) {
      var d = $q.defer();

      $scope.status = "requesting URL " + url + " (fake)...";

      $timeout(function() {
        d.resolve({
          data: {
            data: ["data 1", "data 2"],
            pagination: {
              next_url: "this is next url"
            }
          }
        });
      }, 1000);

      return d.promise;
    }
    // END DO NOT COPY

  $scope.person = PersonService;
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.min.js"></script>

<div ng-app='test' ng-controller='Test'>
  <button type="button" ng-click="person.GetFeed()">GetFeed</button>
  <button type="button" ng-click="person.GetNewPhotos()">GetNewPhotos</button>
  <button type="button" ng-click="person.GetOldPhotos()">GetOldPhotos</button>
  <br>{{status}}
</div>
  • 0
    Привет, Lcycool, спасибо за потраченное время и да, после тестирования я могу добраться до nextUrl, не возвращая его в функцию GetFeed, однако я получаю бесконечный цикл с моим кодом, так что я думаю, что я делаю большую часть этого неправильно.
  • 0
    Мы решили проблему в этом посте: stackoverflow.com/q/31166195/5067669 спасибо за ответ Lcycool, я на самом деле, нет необходимости возвращаться для доступа к этим переменным внутри фабрики :)
1

Вы можете вернуть объект из GetFeed() с обоими значениями:

return {items: items,
 nextUrl = response.data.pagination.next_url
};

Или массив:

return [items, response.data.pagination.next_url];

И затем передайте это обратно в GetOldPhotos в качестве параметра. Я бы позвонил вызывающему абоненту.

Вы говорите, что когда вы устанавливаете переменную nextUrl в GetFeed, она недоступна в функции getOldPhotos? Это меня удивляет. Он должен работать.

  • 0
    Привет, Роберт, спасибо за ответ, но как я могу получить доступ к этому массиву из функции GetOldPhotos? return $ http.get ( nextUrl ) .then (function (response) {} может быть так: GetFeed (). nextUrl? я не могу проверить это прямо сейчас
  • 0
    Привет снова Роберт, ты абсолютно прав! после тестирования nextUrl я могу получить к нему доступ в функции GetOldPhotos, однако все работает не так, как я хочу, поэтому я полагаю, что большая часть кода не соответствует моим потребностям. так как вы опытный пользователь stackoverflow, было бы лучше, если бы я создал новый вопрос со всем моим кодом, о котором идет речь, или я должен сделать это в этом вопросе? Большое спасибо за ваше время
Показать ещё 2 комментария

Ещё вопросы

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