for循环异步调用接口,怎样判断数据已经返回完成?

来源:互联网 发布:mac磁盘工具无法抹掉 编辑:程序博客网 时间:2024/06/05 16:33

在工作中遇到了一个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>
阅读全文
0 0