2012-05-08 3 views
0

외부 파일을 변경하고 저장하는 서블릿과 통신 중입니다. 이 작업에는 시간이 걸리기 때문에 자바 스크립트 함수 호출이 필요하므로 함수 하나의 동작이 다른 함수의 동작을 간섭하지 않도록 할 수 있습니다.순차적 함수 호출

이렇게하려면 busyflag가 false로 설정된 경우 (즉, 다른 functioncall이 동시에 처리되지 않을 때)에만 호출 할 수있는 다른 함수를 사용하는 '순차적'함수를 작성했습니다. 이것은 내 코드입니다.

var busy = false; 
function sequential(action) { 
    while(busy) 
     setTimeout(function(){sequential(action);}, 10); 
    busy = true; 
    action(); 
    setTimeout(function(){busy = false;}, 100); 
} 

function test1() {sequential(function() {alert("test1");});} 
function test2() {sequential(function() {alert("test2");});} 

this은 jsFiddle의 예입니다. 어떤 이유로이 코드는 두 번째 호출에서 루핑을 계속합니다 (functioncall이 대기해야하는 경우).

+0

난 당신이 [deferreds] (http://api.jquery.com/category/deferred-object/) 유용한 것 같아요 ... – elclanrs

답변

0

은 내가 먼저 제임스 몬타 제안 같은 솔루션을 구현하지만, 일부 찾아서 후 난 당신이의을 onreadystatechange 속성을 사용할 수 있다는 것을 발견 XMLHttprequest는 busy-flag를 true로 설정합니다.

이 코드는 예상처럼 작동 :

function sequential(action) { 
if (busy) setTimeout(function(){sequential(action);}, 20); 
else action(); 
} 

function send(message){ 
    busy = true; 
    var request = new XMLHttpRequest(); 
    request.open("POST", "owlapi", true); 
    request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
    request.send(message); 
    request.onreadystatechange = function() {busy = false;}; 
} 
1
while(busy) 
     setTimeout(function(){sequential(action);}, 10); 

setTimeout이 차단되지 않으면 즉시 반환되고 루프가 계속됩니다. Javascript는 단일 스레드이므로이 루프는 계속 실행되고 다른 코드는 실행되지 않습니다. 따라서 busy를 루프를 종료하기 위해 false로 설정하지 않습니다.

ajax 호출을 기다리고 있다면 대기열을 사용하고 콜백 콜백에서 다음 요청을 실행하는 것이 좋습니다.

1

자바 스크립트가 서버로 아약스를 호출하고 있다고 가정합니다.

하나씩 실행하기 위해 다른 호출이 필요한 경우 다음 호출을하기 전에 하나의 호출에서 결과를 얻을 때까지 기다리기 위해 자바 스크립트 코드를 가져와야합니다.

이런 목적으로 jQuery과 같은 자바 스크립트 툴킷을 사용하는 것이 좋습니다. 이런 문제를 해결하기가 훨씬 쉽습니다. jQuery의 모든 ajax 메소드는 적어도 쿼리가 완료 될 때 호출 될 콜백을 허용합니다. jQuery.ajax() 위해 당신은

$.ajax(...).done(function() { 
    // This part will be run when the request is complete 
}); 

그리고 .load()을 위해 갈 수

$("#my_element").load(url,data,function() { 
    // This part will be run when the request is complete 
});