2011-07-27 5 views
3

JavaScript를 통해 작업을 수행하여 브라우저가 응답 성을 유지할 수 있도록 브라우저에서 수행 할 수 있기를 원합니다.자바 스크립트 setTimeout이 실행되었는지 확인하기

내가 취하려고하는 방법은 각 청크를 setTimeout(func, 0) 호출로 대기중인 함수에 전달하여 작업을 청크하는 것입니다.

모든 작업이 완료되면 알려줘야하므로 반환 된 타이머 ID가 맵에 저장됩니다 (id -> true | false). 이 맵핑은 타이머 ID가있는 다음 코드 블록에서 false로 설정되며, 대기열에있는 함수는 완료시 매핑을 true로 설정합니다. 물론 대기중인 함수는 타이머 ID를 알지 못합니다.

더 나은/더 쉬운 방법이있을 수 있습니다 ... 또는 내가 필요에 따라지도를 조작 할 수있는 방법에 대한 조언이 있습니까?

답변

6

배열에 작업을 대기열에 넣고 한 대기열을 처리하고 대기열이 비어 있으면 콜백을 호출합니다. 같은 뭔가 : 브라우저에서 자바 스크립트로

var work = [...]; 

var run = function(work, callback) { 
    setTimeout(function() { 
     if(work.length > 0) { 
      process(work.shift()); 
      setTimeout(arguments.callee, 25); 
     } 
     else { 
      callback(); 
     } 
    }, 25); 
}; 

run(work, function() { 
    alert('Work is done!'); 
}); 

는 (적어도 나는 이것이 당신이 무엇을하고 있는지 생각) 여러 시간 제한을 실행하는 실제 이점이없는 단일 스레드입니다. 브라우저 속도가 느려질 수도 있습니다.

+0

좋아요, 그래서이 접근법이 재귀 적으로 현재 작업이 완료 될 때마다 다음 작업 항목에 시간 초과를 설정한다는 점이 다릅니다. 모든 항목의 시간 제한을 설정하고 완료를 확인하는 대신에. 나는 그것을 시도 할 수 있습니다 ... 건배 – Brabster

+0

대우, 고마워 많이 작동합니다. – Brabster

1

자바 스크립트가 단일 스레드이지만 여러 개의 아약스 호출을 한 번에 처리 할 수 ​​있지만 추가하고 싶습니다. 최근에는 잠재적으로 수백 건의 아약스 호출을 수행해야하는 사이트가 있었으며 브라우저는이를 처리 할 수 ​​없었습니다. 한 번에 5 개의 호출을 실행하기 위해 setTimeOut을 사용하는 큐를 만들었습니다. Ajax 호출 중 하나가 리턴되면 콜백 (단일 스레드에 의해 처리됨)을 발생시킨 다음 스택에서 다음 호출을 수행합니다.

한 번에 한 사람에게만 말할 수있는 관리자라고 상상해보십시오. 직원 5 명을 할당 한 다음 응답을 기다리는 중 어떤 순서로든 기다릴 수 있습니다. 첫 번째 직원이 돌아와 정보를 제공하면 새 직원에게 다음 직원 (또는 동일한 직원)이 돌아 오기를 기다립니다. 그래서 당신이 "싱글 쓰레드"일지라도 5 가지 일들이 동시에 진행됩니다.

관련 문제