0

是否可以在 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;
            }
        }
    }
}

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

4

3 回答 3

1

不,不可能“暂停” for 循环,无论如何它不会让它更快。

不要在这里使用它,但看看window.setTimeout(fn, delay)

于 2012-05-31T22:34:25.880 回答
1

不。

但是,您可以使用以下内容:

(function() {
    var i=0, j=0, k=0, timer;
    timer = setInterval(function() {
        // loop body here
        k++;
        if( k >= max_k) {
            k = 0;
            j++;
            if( j >= max_j) {
                j = 0;
                i++;
                if( i >= max_i) {
                    clearInterval(timer);
                }
            }
        }
    },1);
})();

我不确定如何将它与 集成$.each,您可能必须使用纯 JavaScript 来完成。但是这段代码基本上会在重绘的同时尽可能快地运行循环。

于 2012-05-31T22:36:54.443 回答
1

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

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
                        }
                    }
                }
            }
        });
    }
});
于 2012-05-31T23:32:09.297 回答