javascript - 暂停 for 循环

标签 javascript jquery

是否可以在 javascript/jquery 中暂停 for 循环?

我有一个$.each,它运行一个63长的数组,里面有一个for,里面有另一个for,其中还有另一个 for (使 each>for>for>for),现在每个 for 都会遍历数组,这会产生 63^4(等于 15752961)个不同的组合,这需要时间...

Sooo,是否可以在 2k 组合时暂停 2 秒?

我想暂停循环的原因是为了解锁 UI...

代码:

var $arr = ["","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","0","1","2","3","4","5","6","7","8","9"],
len = $arr.length,
l = 0,
$("body").delay(1000).show(0, function(){
    $.each($arr, function(index, val){ // 63
        for(var i = 0; i < len; i++){ // 3969
            for(var j = 0; j < len; j++){ // 250047
                for(var k = 0; k < len; k++){ // 15752961
                    thing = val+i+j+k;
                    l++;
                    $("#loading").text(l+"/15752961");
                    console.log(l+"/15752961");
                    $("<div>"+thing+"</div><br />").prependTo("body");                                  
                }
            }
        }
    })
})

诗。如果有人认为他们可以解决我的问题,请这样做:D

/* 编辑 */ 如果我尝试运行此服务器端,如果我使用 foreachfor

,则会收到服务器错误
$smaa = range("a","z");
$store = range("A","Z");
$tal = range("0","9");
$arr = array_merge($smaa, $store, $tal);

for($i = 0; $i < $count; $i++){ // 62
    for($j = 0; $j < $count; $j++){ // 3844
        for($k = 0; $k < $count; $k++){ // 238328
            for($l = 0; $l < $count; $l++){ // 14776336
                $finish[] = $arr[$i].$arr[$j].$arr[$k].$arr[$l];
            }
            $finish[] = $arr[$i].$arr[$j].$arr[$k];
        }
        $finish[] = $arr[$i].$arr[$j];
    }
$finish[] = $arr[$i];
}

foreach($arr as $first){ // 62
    $finish[] = $first;
    foreach($arr as $second){ // 3844
        $finish[] = $first.$second;
        foreach($arr as $third){ // 238328
            $finish[] = $first.$second.$third;
            foreach($arr as $fourth){ // 14776336
                $finish[] = $first.$second.$third.$fourth;
            }
        }
    }
}

请注意,我不会同时使用两者

最佳答案

这尚未经过测试,但希望您能明白。说实话,这可能是您应该在服务器端处理的事情,或者执行一次并将输出存储在代码中。

var $arr = ["","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","0","1","2","3","4","5","6","7","8","9"],
len = $arr.length,
l = 0,
paused = false,
writer = '',
pauseAt = 2000;

$("body").delay(1000).show(0, function(){

    function killForTwoSeconds(){ //function to timeout loop
         paused = true; //set to true to kill loop
         $('body').append(writer); //write to body only on pause (fewer writes to dom = faster script)
         setTimeout(function(){ // wait for 2 seconds
              paused = false;
              loopIt(); // re-run loop
         },2000);
    }

    function loopIt(){
        $.each($arr, function(index, val){ 
            for(var i = l; i < len; i++){ 
                for(var j = l; j < len; j++){ //loops now start at l instead of 0 so when loop restarts it restarts at the right place
                    for(var k = l; k < len; k++){ 
                        if(l % pauseAt === 0){ // if l is divisible by 2000 kill 
                            killForTwoSeconds();
                        }
                        if(!paused){ //if not paused add item to writer
                            thing = val+i+j+k;
                            l++;
                            $("#loading").text(l+"/15752961");
                            console.log(l+"/15752961");
                            writer = "<div>"+thing+"</div><br />";                                  
                        }else if(index === len-1 && k === len-1){
                            $('body').append(writer); //final write
                        }else{
                            return false; // if paused return false
                        }
                    }
                }
            }
        });
    }
});

关于javascript - 暂停 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10842182/

相关文章:

javascript - 如何显示其中包含动态内容 (HTML) 的面板

JavaScript。引用文献问题。遗产。范围

javascript - 通过 jQuery AJAX 将多个数组从 PHP 传递到 Javascript

javascript - 当我们选中和取消选中其他表中的复选框时,如何在 jquery 中的表中添加/删除行?

javascript - 如何合并两个脚本并同时触发它们?

javascript - 将一个变量添加到另一个变量

javascript - 在 ASP 中使用 javascript 时,如何从两个单选按钮中选择一个?

jQuery 内容不是函数

jquery - 如何取消 jQuery UI 对话框的打开?

javascript - 如何在 bootstrap 多选中获取 MySQL 数据?