我是靠谱客的博主 缥缈百褶裙,这篇文章主要介绍for循环异步调用接口,怎样判断数据已经返回完成?,现在分享给大家,希望可以做个参考。

在工作中遇到了一个for循环调用接口的例子:首先要根据一个集群ID,去调用接口查询此集群下的所有“命名空间”,接着再用for循环来一个个查询所有“命名空间”下的“实例”,eg:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<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 ?我们只需再加一个 变量即可:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<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>

再来看一种实现,如果需要提示用户和哪些实例冲突了,那么你就需要将冲突的实例保存到一个临时变量里。但你会发现需要穷尽所有的实例,才能确定冲突的实例。(性能问题,可想而知)

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<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循环异步调用接口内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部