2015-08-19 2 views
0

У меня есть service, который я хочу использовать для первого захвата объекта из файла JSON, а затем для возврата выбранных данных из указанного объекта, в зависимости от запросов пользователя.Манипулировать результаты, хранящиеся в «обещании»

Эта услуга может использоваться несколько раз за посещение, поэтому я не хочу, чтобы пользователь должен был ждать, пока данные извлекаются в каждом случае.

Я установил сервис только для запроса файла JSON один раз на загрузку страницы, но у меня возникли проблемы с извлечением только тех данных, которые я хочу вернуть.

Моя идея состояла в том, чтобы взять клон исходного promise объекта (называемый promiseAll в моем коде), а затем манипулировать данными в пределах, прежде чем вернуться, что клонированный объект (называемый «promiseSelected») для пользователя.

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

Я не уверен, что я делаю неправильно (или если есть лучший способ сделать это), но я буду использовать любые указатели.

Вот как я использую service -

app.controller('searchCtrl', ['$scope', '$localStorage', '$stationsList', function($scope, $localStorage, $stationsList){ 

    $stationsList.getList('searchable').then(function(data){ 
     $scope.stationsList = data; // Grab a list of searchable stations 
    }); 

}]); 

А вот полный service -

app.service('$stationsList', ['$http', function($http, $scope){ 

    var tempStations, 
     promiseAll, 
     promiseSelected; 

    /** 
    * Grab a list of the required stations 
    * 
    * @param string type    The type of list to return 
    * @return object promiseSelected A promise object containing the stations requested by the user 
    */ 
    var getStationsList = function(type){ 

     if(!promiseAll){ 

      promiseAll = $http.get('stations.json').then(function(res){ 
       return res.data; // Grab the JSON list of all stations 
      }); 

     } 

     promiseSelected = angular.copy(promiseAll); // Take a fresh copy of 'promiseAll' 
     tempStations = [];       // Reset to an empty array 

     switch(type){ 

      case "searchable": 

       promiseSelected = promiseAll.then(function(data){ 

        [].map.call(data || [], function(elm){ // Map all stations... 
         if (elm.link.indexOf(".xml") > -1) // Check to see if the station is searchable 
          tempStations.push(elm);   // It is - add the station to 'tempStations' 
        }); 

        return tempStations; 

       }); 

       break; 

      case "locatable": 

       promiseSelected = promiseAll.then(function(data){ 

        [].map.call(data || [], function(elm){ // Map all stations... 

         if(
         isFinite(parseFloat(elm.latitude)) && 
         isFinite(parseFloat(elm.longitude)) 
         )         // Check to see if the station is locatable 
          tempStations.push(elm);   // It is - add the station to 'tempStations' 

        }); 

        return tempStations; 

       }); 

       break; 

      default: 
       promiseSelected = promiseAll; 

     } 

     return promiseSelected; 

    }; 

    return{ 
     getList: getStationsList 
    }; 

}]); 
+0

Ваш клон бесполезен и в любом случае не используется вашим кодом. Мне трудно понять, что вы ожидаете, и что происходит вместо этого. Вероятно, проблема заключается в том, что вы повторно используете одну и ту же переменную tempStations evrywhere. Эта переменная должна быть локальной для каждой функции, переданной then(). –

+0

Эта простая небольшая замена, похоже, выполнила эту работу. Пожалуйста, отметьте это как ответ, и я буду рад принять его. –

ответ

1

Проблема заключается в том, что вы повторно использовать тот же tempStations переменную везде. Эта переменная должна быть локальной для каждой функции, переданной в then().

+0

Спасибо за подсказку, я постараюсь запомнить это в будущем. –

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