2013-04-19 1 views
3

Я обрабатываю своего рода «большой» объект JSON вокруг 4000 элементов, проходящих для разных методов, и я хотел бы обновить тег div текстом, показывающим процесс.как предупреждение сделать прерывание javascript? могу ли я сделать это с кодом?

Но по какой-то странной причине (только что протестированной в Firefox и Chrome) они не обновляют объект DOM с текстом.

$("#estatusBar").text(_item.Centro_de_trabajo); 

Оба предпочитают продолжать вычислять все данные и другие процессы без необходимости и не тратьте время на обновление текста. Но если я просто закодирую Alert("") в цикле, а затем в chrome, я нажимаю на «выбранный ящик», говорящий, игнорируя все остальные предупреждения, хром вдруг начинает обновлять текст.

Итак, я думал, могу ли я «приостановить» расчет каким-то кодом, чтобы остановить и обновить элемент DOM, а затем продолжить выполнение другого процесса?

Возможно ли это, или что является альтернативой этому странному поведению?

- EDIT -

это код петли

$.each(plantillas, function(_index, _item){ 
     updateBar(_item.Centro_de_trabajo); 
     calculateItem(_item,_index); 
     a.push("<div class='blockee'><ul>"+ /*temp.join("")*/ t(_item) +"</ul></div>"); 
    }); 
+1

Вам нужно будет использовать таймер (setInterval/SetTimeout), чтобы разделить вашу обработку в куски. Можно использовать веб-работников, но это ограничит работу с более старыми браузерами. –

+0

ok дайте мне попробовать ... спасибо – ncubica

+0

В вашем сценарии вы должны смотреть на обратный вызов, а не на тайм-аут/интервал. Покажите больше кода, если вам нужна дополнительная помощь – hop

ответ

1

Нет, вы не можете делать то, что делает предупреждение. Это ограничение действительно раздражает в некоторых случаях, но если ваша проблема - это просто прогресс для одного длинного вычисления, тогда решение прост.

Вместо того чтобы делать Alll записей в одном цикле ломают вычислений в «достаточно мал» куски, а затем сделать что-то вроде

function doit() 
{ 
    processBlockOfRecords(); 
    updateProgressBar(); 
    if (!finished()) { 
     setTimeout(doit, 0); 
    } 
} 

setTimeout(doit, 0); 

При таком подходе также просто добавить кнопку «Отмена», чтобы остановить вычисление.

В вашем примере петля

$.each(plantillas, function(_index, _item){ 
    updateBar(_item.Centro_de_trabajo); 
    calculateItem(_item,_index); 
    a.push("<div class='blockee'><ul>"+ /*temp.join("")*/ t(_item) +"</ul></div>"); 
}); 

поэтому вычисление можно разделить с (непроверенные)

function processRecords(plantillas, completion_callback) { 
    var processed = 0; 
    var result = []; 

    function doit() { 
     // Process up to 20 records at a time 
     for (var i=0; i<20 && processed<plantillas.length; i++) { 
      calculateItem(plantillas[processed], processed); 
      result.push("<div class='blockee'><ul>" + 
         t(plantillas[processed]) + 
         "</ul></div>"); 
      processed++; 
     } 

     // Progress bar update 
     updateProgress(processed, plantillas.length); 

     if (processed < plantillas.length) { 
      // Not finished, schedule another block 
      setTimeout(doit, 0); 
     } else { 
      // Processing complete... inform caller 
      if (completion_callback) completion_callback(result); 
     } 
    } 

    // Schedule computation start 
    setTimeout(doit, 0); 
} 
+0

ohhh !! позвольте мне попробовать. !! – ncubica

+0

Но функция должна идти внутри петли? Я не очень понимаю эту концепцию. Я обновляю свой вопрос. с кодом ... – ncubica

+0

спасибо, человек, это работает ...! – ncubica

1

Вы можете попробовать использовать web workers, отложить расчет на задний план, и это должно помочь вам. Работники веб-сайтов были созданы так, чтобы делать это очень просто (толкнуть большие вычисления в фоновый поток). Однако это может не работать во всех браузерах. Ваша основная проблема является IE и только IE 10 поддерживает его:

enter image description here

+0

. Я думаю, что это полный ответ этого http://www.html5rocks.com/en/tutorials/workers/basics/ – ncubica

0

Вы хотите какой-то вариант ожидания или паузу или сон или подобный в JavaScript является то, что это?

Единственный путь с

window.setTimeout() 

Вы можете приостановить любую функцию с ней.

Проверить этот пост тоже может помочь: Sleep/Pause/Wait in Javascript

Смежные вопросы