Обычно в коде, который зацикливается, встречается долго работающий скрипт.
Если вам нужно перебрать большой набор данных, и это можно сделать асинхронно - сродни другому потоку, затем перенесите обработку на веб-работника (http://www.w3schools.com/HTML/html5_webworkers.asp).
Если вы не можете или не хотите использовать веб-работника, вы можете найти свой основной цикл, который вызывает долго выполняющийся скрипт, и можете дать ему максимальное количество циклов, а затем заставить его возвращаться клиенту, используя setTimeout .
Плохо: (thingToProcess может быть слишком большим, что приводит к длительному запуску скрипта)
function Process(thingToProcess){
var i;
for(i=0; i < thingToProcess.length; i++){
//process here
}
}
Хорошо: (допускается только 100 итераций до возврата)
function Process(thingToProcess, start){
var i;
if(!start) start = 0;
for(i=start; i < thingToProcess.length && i - start < 100; i++){
//process here
}
if(i < thingToProcess.length) //still more to process
setTimeout(function(){Process(thingToProcess, i);}, 0);
}
Оба могут быть вызваны одинаково:
Process(myCollectionToProcess);