我有一个service
,我希望用它来首先从JSON文件中获取一个对象,然后从所述对象返回所选数据,具体取决于用户请求的内容。
每次访问可能会多次使用此服务,因此我不希望用户在每次检索数据时都要等待。
我已将服务设置为每页加载仅请求一次JSON文件,但我只是在提取我想要返回的数据时遇到了一些问题。
我的想法是在返回克隆对象之前,先删除初始promise
对象(在我的代码中称为promiseAll
),然后在其中操作数据(称为&# 39; 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 :(得分:1)
问题是您在任何地方都重用了相同的tempStations
变量。该变量应该是传递给then()
的每个函数的本地变量。