概述
在工作中遇到了一个for循环调用接口的例子:首先要根据一个集群ID,去调用接口查询此集群下的所有“命名空间”,接着再用for循环来一个个查询所有“命名空间”下的“实例”,eg:
<script type="text/javascript">
namespaceService.getNamespaceList(clusterId,...(其它参数)).then(
function( response ){
var namespaceList = response.items;
var sensitiveWordFlag = false;
for( var i = 0; i < namespaceList.length; i++){
clusterService.getPods( namespaceList[i].name, ...(其它参数)).then(
function( res ){
for( var j = 0;j<res.length;j++ ){
if( res[j].name.test("abc") == true){
window.alert("含有敏感字符abc");
sensitiveWordFlag = true;
return;
}
}
}
)
if( !sensitiveWordFlag ){
window.alert("所有返回数据内容没有敏感字符");
}
}
}
);
</script>
大家应该看出问题了,最后那个函数里面最后一个 if 的写法是有问题的,因为接口的调用是异步执行的,一个命名空间的数据还没有返回,它就先直接走进去了。那我们该如何改写呢?也就是要加一个怎样的判断条件,才能控制它是在所有的接口数据都在执行完上一个 if 以后,再走这一个 if ?我们只需再加一个 变量即可:
<script type="text/javascript">
namespaceService.getNamespaceList(clusterId,...(其它参数)).then(
function( response ){
var namespaceList = response.items;
var sensitiveWordFlag = false; // 敏感字符标识
var count = 0; // 执行次数, 用于判断是否遍历完所有namespace
for( var i = 0; i < namespaceList.length; i++) {
// 如果之前有敏感字符,就不再遍历
if (sensitiveWordFlag) {
break;
}
clusterService.getPods( namespaceList[i].name, ...(其它参数)).then(
function( res ){
// 遍历一个namespace ,count + 1
count++;
// 如果之前有敏感字符,就不再遍历
if (sensitiveWordFlag) {
return;
}
// 判断所有实例是否有敏感字符
for( var j = 0;j<res.length;j++ ){
if( res[j].name.test("abc") == true){
sensitiveWordFlag = true;
window.alert("含有敏感字符abc");
return; // break;
}
}
// 当标识位是False,且计数等于namespace长度的时候,说明已经遍历所有的namespace,也没发现敏感字符
if( !sensitiveWordFlag && count == namespaceList.length ){
window.alert("所有返回数据内容没有敏感字符");
}
}
); // getPods
}
}
);
</script>
再来看一种实现,如果需要提示用户和哪些实例冲突了,那么你就需要将冲突的实例保存到一个临时变量里。但你会发现需要穷尽所有的实例,才能确定冲突的实例。(性能问题,可想而知)
<script type="text/javascript">
namespaceService.getNamespaceList(clusterId,...(其它参数)).then(
function( response ){
var namespaceList = response.items;
var sensitiveWord = []; //用于记录敏感的实例名称
var count = 0; // 执行次数, 用于判断是否遍历完所有namespace
for( var i = 0; i < namespaceList.length; i++) {
clusterService.getPods( namespaceList[i].name, ...(其它参数)).then(
function( res ){
// 遍历一个namespace ,count + 1
count++;
// 判断所有实例是否有敏感字符
for( var j = 0;j<res.length;j++ ){
if( res[j].name.test("abc") == true){
// 保存敏感的实例名称
sensitiveWord[sensitiveWord.length] = res[j].name;
}
}
// 当遍历完所有namespace时,判断sensitiveWord
if( count == namespaceList.length ){
if (sensitiveWord.length > 0){
window.alert("含有敏感字符abc");
// sensitiveWord保存的值,是所有敏感实例的名称
} else {
window.alert("所有返回数据内容没有敏感字符");
}
}
}
); // getPods
}
}
);
</script>
最后
以上就是缥缈百褶裙为你收集整理的for循环异步调用接口,怎样判断数据已经返回完成?的全部内容,希望文章能够帮你解决for循环异步调用接口,怎样判断数据已经返回完成?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复