如何在同一工厂的不同javascript函数中访问变量?

时间:2015-07-01 02:23:35

标签: javascript angularjs ionic-framework

我试图用离子框架构建一个Instagram feed应用程序,我创建了一个工厂来处理我的html请求,所以我可以在我的控制器上使用它们,事情是,使用instagram API,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;
  });
}
}
});

我想使用GetFeed函数中的 nextUrl = response.data.pagination.next_url; 来获取next_url并在GetOldPhotos函数上使用它,该函数将使用nextUrl来加载旧照片,我不认为我可以从同一个函数返回2个值,我认为$ scope不是工厂的选项。

我知道可能有不止一种方法可以达到这个目的,但我刚开始使用离子,角度和javascript,并且我真的会被困在这里,如果我能得到一些"指导" :d 对于这篇文章中的任何语法,语法或任何其他错误,请注意,并提前感谢您!

2 个答案:

答案 0 :(得分:1)

您可以使用两个值从GetFeed()返回一个对象:

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

或数组:

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

然后将其重新传递给GetOldPhotos作为参数。我会让来电者保持状态。

你是说当你在GetFeed中设置nextUrl变量时,它在getOldPhotos函数中不可用吗?这让我感到惊讶。它应该工作。

答案 1 :(得分: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>
&#13;
&#13;
&#13;