JS висит на цикле do while

Мне интересно, как я могу решить висящую страницу с JS.

У меня есть цикл JS, который я тестирую следующим образом, но кажется, что он зависает навсегда - есть ли способ остановить его зависание при выполнении сценария?

<div id="my_data"></div>

<script>
function test(value){
output= [];
do{ 
    value++;
    output.push(value);
    document.getElementById('my_data').innerHTML = (output.join(''));
}while(value < 10000000);
alert('end'); // never occurs
}

test(0);
</script>
 Sir30 мая 2012 г., 06:14
Ничего, я просто делаю тест - я не применяю его для сайта или чего-либо еще.
 diEcho30 мая 2012 г., 06:13
что вы хотите сделать с 10000000 раз ??
 diEcho30 мая 2012 г., 06:16
не проверяйте терпение браузера
 Ja͢ck30 мая 2012 г., 06:31
@ Дэйв, если вы заинтересованы, я обновил свой ответ, чтобы дать вам представление о том, что будет работать :)
 Sir30 мая 2012 г., 06:30
@AlexeiLevenkov есть таймер, прежде чем я могу отметить их.

Ответы на вопрос(6)

вероятно, всегда исчерпывает вычислительную мощность. Я бы сделал это кусками. Скажем, разделите ваш список на меньшие списки и сделайте паузу в 5 мс между списками. Я могу привести пример, если вам нужно.

пока это не будет сделано; кроме того, 10M элементов массива ?!

Если вы действительно хотите это сделать, и не позволяйте браузеру зависать до тех пор, пока вам не придется использоватьsetInterval чтобы браузер обновлялся между ними.

function updater(value, max, interval) {
  var output = [],
  node = document.getElementById('my_data'),
  tid = setInterval(function() {
    if (value++ < max) {
      output.push(value);
      node.innerH,TML = (output.join(''));
    } else {
      alert('done');
      clearInterval(tid);
    }
  }, interval);
}

updater(0, 10, 200);

поэтому больше ничего не может произойти, пока он выполняет ваш цикл. Он запускается десять миллионов раз, и при каждом запуске он устанавливает innerHTML из #my_data в что-то новое. Это очень неэффективно и кажется бесполезным. Что вы пытаетесь достичь?

 Sir30 мая 2012 г., 06:15
Должен быть способ сделать это все же.
 Sir30 мая 2012 г., 06:14
Я хочу видеть увеличение числа по мере его зацикливания
 30 мая 2012 г., 06:15
Это не произойдет. Браузер выполнит повторный рендеринг только после завершения вашего цикла.
 30 мая 2012 г., 06:17
Да. Если каждая итерация цикла используетsetTimeout чтобы обновить DOM, иногда могут появляться всплывающие значения.
 30 мая 2012 г., 06:17
@Dave: посмотрите демо в моем ответе. Вычисление, которое вы пытаетесь выполнить, отменит рендеринг элемента, поэтому единственное решение состоит в том, чтобы таймер быстро обновил ваше значение.
Решение Вопроса

10,000,000 последовательные числа объединяются в строку, которая действительно не будет хорошо работать на любом современном суперкомпьютере.

Если вы хотите опросить ход выполнения, настройте таймер, чтобы он выполнялся несколько медленнее. Это не практично, но выглядит красиво:http://jsfiddle.net/V6jjT/2/

HTML:

<div id="my_data"></div>

Автор сценария:

var value = 0;
var interval = setInterval(function() {
    if (value > 100) {
        clearInterval(interval);
        return;
    }

    value++;
    document.getElementById('my_data').innerHTML += ' ' + value;
}, 10);
 Sir30 мая 2012 г., 06:18
Ах, это больше нравится!
 30 мая 2012 г., 08:36
Можете ли вы обновить свой вопрос, упомянув, что вы хотите видеть обновления по мере их появления, чтобы сделать вопрос и ответить более полезным для других?

function test(value){
    output= [];
    do { 
        value++;
        output.push(value);
    } while(value < 10000000);
    document.getElementById('my_data').innerHTML = (output.join(''));
    alert('end'); // never occurs
}

должно сработать (хотя для отображения 10 миллионов чисел в HTML все равно потребуется время).

Если вы хотите, чтобы числа работали, вы должны взглянуть наwindow.setInterval - браузеру нужно некоторое время между выполнением js, чтобы обновить его вид. Таким образом, вам придется переписать ваш код, выполняя несколько кусков данных асинхронно. Смотрите также:

Running a long operation in javascript? (example code for your loop) How can I force the browser to redraw while my script is doing some heavy processing? Javascript async loop processing Prevent long running javascript from locking up browser DOM refresh on long running function Best way to iterate over an array without blocking the UI Javascript - how to avoid blocking the browser while doing heavy work?
 Sir30 мая 2012 г., 06:14
Но это только приведет к отображению последнего числа, которое я хочу видеть, как число увеличивается по мере его зацикливания.
 30 мая 2012 г., 06:19
Вы не можете на самом деле. Браузер обновит свой пользовательский интерфейс, чтобы отображать числа после завершения цикла. Перед тем как повесить причину выполнения JS.

Если вы какой-то супер-существо из будущего, то, возможно, это имеет смысл.

 30 мая 2012 г., 06:11
Мне нравится этот ответ нокаутом +1
 Sir30 мая 2012 г., 06:11
Как еще я могу обновить div, так как он зацикливается, чтобы я мог видеть, как увеличивается число?
 Sir30 мая 2012 г., 06:12
Просто тестирую его, но я хочу, чтобы он отображал & quot; значение & quot; в браузере как оно идет.
 30 мая 2012 г., 06:12
@ Дэйв, что в мире ты пытаешься сделать?
 30 мая 2012 г., 06:12
@ Дэйв Попробуйте сделать это 20 раз. Тогда работай.

Ваш ответ на вопрос