如果存在setTimeout,则输出顺序将不同

时间:2018-09-18 04:58:55

标签: javascript recursion settimeout

使用递归函数将树结构返回到console.log的代码,如下所示。我添加setTimeout是因为在代码处理过程中需要一些延迟,但是当我添加它时,处理顺序将以完全不同的格式输出。而且,延迟时间似乎不是恒定的。

预期值为

如果在搜索第一个类别标题之后节点中有一个子级,则通过递归搜索第二个类别标题,并再次查询children值,然后再查询第三个.. ..如果添加了setTimeout,则整个种子将首先播种,然后是第二个播种,然后是第三个播种,依此类推。

为什么会这样?

            var time = 0;
            function searchTree(v, t){

                $(v).each(function(i,k){
                    setTimeout(function(){
                        if (t == 'clone'){
                            console.log(k.sCategoryTitle);
                            if (k.children){
                                searchTree(k.children,'clone');
                            }
                        }
                    }, time = time + 100);
                });
            }

示例代码:http://jsfiddle.net/uahg5qd9/3/

1 个答案:

答案 0 :(得分:0)

您已使功能同步。

如果有帮助,请尝试下面的代码。在这里,我删除了循环,并放置了另一个同步函数以使其同步。

var time = 100;
function searchTree(v, t){
    var i=0;
    function loop(){
        if(i<v.length){
            let k = v[i];    
            if (t == 'clone'){
                console.log(k.sCategoryTitle);
                if (k.children){
                    setTimeout(function(){
                        time = time + 100;
                        searchTree(k.children,'clone');
                    },time);
                }else{
                    i++;
                    loop();
                }
            }else{
                i++;
                loop();
            }
        }else{
            i++;
            loop();
        }
    }
    loop();
}