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

概述

在工作中遇到了一个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循环异步调用接口,怎样判断数据已经返回完成?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部