У меня есть 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
};
}]);
Проблема в том, что вы повторно используете ту же tempStations
переменную tempStations
. Эта переменная должна быть локальной для каждой функции, переданной then()
.