操作存储在 'promise' 中的结果
Manipulate the results stored within a 'promise'
我有一个 service
,我想用它首先从 JSON 文件中抓取一个对象,然后 return 从所述对象中选择数据,这取决于用户请求。
每次访问可能会多次使用此服务,因此我不希望用户每次都必须等待检索数据。
我已将服务设置为每次加载页面仅请求一次 JSON 文件,但我在仅提取我希望 return.[=19 的数据时遇到了一些问题=]
我的想法是克隆初始 promise
对象(在我的代码中称为 promiseAll
),然后在 return 克隆之前操作其中的数据对象(称为 '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
变量。这个变量应该是传递给 then()
.
的每个函数的局部变量
我有一个 service
,我想用它首先从 JSON 文件中抓取一个对象,然后 return 从所述对象中选择数据,这取决于用户请求。
每次访问可能会多次使用此服务,因此我不希望用户每次都必须等待检索数据。
我已将服务设置为每次加载页面仅请求一次 JSON 文件,但我在仅提取我希望 return.[=19 的数据时遇到了一些问题=]
我的想法是克隆初始 promise
对象(在我的代码中称为 promiseAll
),然后在 return 克隆之前操作其中的数据对象(称为 '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
变量。这个变量应该是传递给 then()
.