在我的服务工厂中,我查找了一个大型数据集——我想持久化它,并检查它的存在,以避免再次调用它
In my service-factory I lookup up a large dataset - I want to persist it and check for its existence to avoid calling it again
我的服务(工厂)进行API调用并将响应数据分配给变量:
.factory('MedicationMatchingNamesFactory',
['$http', '$q', 'MedicationDisplayNamesFactory',
function MedicationMatchingNamesFactory($http, $q, MedicationDisplayNamesFactory){
return {
getMatchingNames: function(inputValue){
var matches = [];
// I thought this may be set as null so I'm able to
// differentiate it from the below array form (when exists)
var allNames = null;
MedicationDisplayNamesFactory.getDisplayNames().then(
function(response){
// this is the large dataset - now as array
var allNames = response.data.displayTermsList.term;
angular.forEach(allNames, function(value, key){
if(value.indexOf( inputValue ) !== -1){
matches.push(value);
}
});
}
);
return matches;
}
};
return MedicationMatchingNamesFactory;
}])
我使用Angular UI的"UI-select"指令来根据输入的字符串在这个大型数据集中进行搜索。
在我的控制器中:
$scope.$on('inputStarted', function(event, value){
if(value.length > 3){
$scope.meds.displayNames = MedicationMatchingNamesFactory.getMatchingNames(value);
console.log($scope.meds.displayNames);
}
});
现在,为了避免每次输入字符数大于3时查询API(实际上调用另一个包含对API调用的服务),我认为如果我能够检查allNames
是null
(空,请调用API)还是array
(跳过调用,只使用它),那将是非常好的。
我尝试将angular.forEach
部分移到调用和承诺之外,但很明显,没有发生任何事情,因为它在第一次运行时还没有解决。
在执行API调用之前,是否有方法检查此allNames
数据集?
您可以将allNames
的声明移动到服务的返回语句之外,然后在查询API之前检查它是否为null
。以这种方式allNames
用作内部API调用的结果的高速缓存。
另外,请注意,最好从getMatchingNames
返回promise,否则您的服务总是立即返回一个空白数组,然后在内部API调用完成后填充该数组。如果您确实返回了promise,则需要更改在inputStarted
事件处理程序中设置displayNames
的方式:
MedicationMatchingNamesFactory.getMatchingNames.then(function(matches) {
$scope.meds.displayNames = matches;
});
你的服务可能是这样的:
.factory('MedicationMatchingNamesFactory',
['$http', '$q', 'MedicationDisplayNamesFactory',
function MedicationMatchingNamesFactory($http, $q, MedicationDisplayNamesFactory) {
var allNames = null;
function getMatches(inputValue, list){
var matches = [];
angular.forEach(list, function(value, key){
if(value.indexOf(inputValue) !== -1){
matches.push(value);
}
});
return matches;
}
return {
getMatchingNames: function(inputValue){
var deferred = $q.defer();
if (allNames !== null) {
deferred.resolve(getMatches(inputValue, allNames));
} else {
MedicationDisplayNamesFactory.getDisplayNames().then(
function(response){
// this is the large dataset - now as array
allNames = response.data.displayTermsList.term;
deferred.resolve(getMatches(inputValue, allNames));
},
function(reason){
deferred.reject(reason);
}
);
}
return deferred.promise;
}
};
}])
实际上,这个问题的解决方案很简单:我只是使用了sessionStorage
,在这种情况下,它似乎完全符合我的需求,因为我需要为这个会话保留大数据集,如果它在下一个会话中丢失也没关系。目标是防止多次获取,也就是说,超过必要的次数,因为在该会话期间,里面的值不太可能更改。
相关文章:
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 在单击任何位置时隐藏元素,而不检查每次DOM单击
- 如何检查管道中未定义的项目
- 主干-不管怎样,检查事件以前是否绑定过
- 使用javascript检查多个输入值,并在1次检查中标记多个输入框
- 递归使用 eval() 是检查程序执行的好方法吗?
- 检查onsubmit doenst work jquery contactform上的函数
- JavaScript 检查隐藏字段中的值并将其设置为隐藏字段值
- API密钥使用和检查示例
- 如何让程序检查所选单词中是否有按键
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 用于检查数组中是否存在元素的javascript自定义方法
- 如何检查字符串的一部分与数组匹配
- Jquery如何检查今天的时间大于使用给定时间
- 使用javascript反复检查用户在facebook上的登录状态
- 使用 jQuery 检查所有值是否为空或已填充
- 使用Javascript使用数组检查文本框中的值
- 在我的服务工厂中,我查找了一个大型数据集——我想持久化它,并检查它的存在,以避免再次调用它
- 如何在Javascript中持久化检查屏幕宽度
- 使用本地存储持久化检查状态