2013-04-19 1 views
3

4000 개의 요소 중 다른 메서드에 전달되는 일종의 "큰"JSON 개체를 처리 중이므로 div 태그를 프로세스를 나타내는 텍스트로 업데이트하고 싶습니다.경고가 자바 스크립트를 중단시키는 방법은 무엇입니까? 코드로 할 수 있습니까?

하지만 이상한 이유로 (Firefox와 Chrome에서 테스트 한 것만) DOM 객체를 텍스트로 업데이트하지 않습니다.

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

둘 다 모두 데이터 및 기타 프로세스를 계산하지 않고 계속해서 텍스트를 업데이트하는 데 시간을들입니다. 그러나 루프에 Alert("")을 코딩하고 크롬에서 다른 모든 경고를 무시하는 "선택된 상자"를 클릭하면 크롬이 갑자기 텍스트를 업데이트하기 시작합니다.

DOM 요소를 중지하고 업데이트 한 다음 다른 프로세스를 계속 작성하는 것과 같은 일종의 코드를 사용하여 계산을 "일시 중지"할 수 있다고 생각했습니다.

이게 가능합니까 아니면이 이상한 행동의 대안이 될 수 있습니까?

- 편집 -

이 루프

$.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 시도해주세요 ... thanks – ncubica

+0

시나리오에서 타임 아웃/간격 대신 콜백을 조사해야합니다. 더 많은 도움이 필요하면 더 많은 코드보기 – hop

답변

1

이 아니 당신이 경고가 무엇을 할 수 없습니다. 이 제한은 실제로 어떤 경우에는 성가시다. 그러나 문제가 하나의 긴 계산을위한 단순한 진행이라면 솔루션은 간단하다. 대신이 방법을

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

setTimeout(doit, 0); 

같은 것을 "작은 충분"청크로 계산을 중단하고 다음 중 하나 개를 수행 단일 루프의 레코드 alll 일을

중지하기 위해 "취소"버튼을 추가하는 것도 간단합니다 계산. 당신의 예에서

루프 때문에 계산이 (안된)로 분할 될 수

$.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

오 답변에 대한 완전한 답변입니다. 그것을 시도하자. – 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

이 대기의 일부 버전을 원하거나 일시 중지하거나 잠이나 자바 스크립트와 유사한이 있다는 것입니다합니까? 당신은 그것으로 어떤 기능을 일시 정지 할 수 있습니다

window.setTimeout() 

수있는 유일한 방법입니다. 이 게시물이 너무 도움이 될

확인 : Sleep/Pause/Wait in Javascript

관련 문제