2011-12-04 3 views
2

작업 완료 여부를 확인해야하는 javascript 함수가 있습니다. 작업이 완료되면 서버의 파일에 완료 레코드가 있습니다. 파일에서 완료 레코드를 얻을 때까지 약간의 지연 (잠재적으로 증가하는)을 가진 서버에 대한 재귀 호출을 수행하는 함수입니다. 아래 코드는 웹 콘솔에서 [20 : 06 : 21.202] [20 : 06 : 21.563] [012 : 20 : 06 : 21.990] 예를 들어 초과하는 간격으로 서버를 과도하게 호출합니다. 그러나 작업이 변수 waittime 값이 max_waittime과 같아졌습니다. 테스트 케이스의 전체 출력이 예상대로이지만 기능에 문제가 있습니다. 내가 틀렸어?작업 완료 확인

function check_status(time,div_id,filename) { 

var status =0; 
var waittime=time; 

var max_waittime=11000000; 
if (waittime < max_waittime){waittime=waittime+1000000; } 

$.ajax({ 
    type: "GET", 
    async: false, 
    url: "code_on_server_checking_file.php", 
    data: "f="+filename, 
    dataType: "text", 
    success: function(content) { 

    if (content) { 
    // stuff related to output of the result 
     .... 
     return status=1; 
    } 
    else {return status=0;} 
     } 
    }); 

if (status == 0 && waittime < 20000000){ 
    setTimeout(check_status(waittime,div_id,filename),waittime); 
    } 
else {alert('check_status passed!'+status+'|'+waittime);} 
} 

답변

0

: 당신이 check_status에 매개 변수를 전달해야하기 때문에, 익명 함수를 사용합니다. 익명 함수로 함수 호출을 래핑하십시오. 또한 동기 호출을 사용하는 대신 필요한 경우 ajax 콜백에서 호출을 설정하는 것이 좋습니다. 동기 호가 브라우저를 연결합니다.

function check_status(time,div_id,filename) { 

    $.ajax({ 
     type: "GET", 
     url: "code_on_server_checking_file.php", 
     data: "f="+filename, 
     dataType: "text", 
     success: function(content) { 
     if (content) { 
     // stuff related to output of the result 
     } 
     else { 
      time += 1000000; 
      if (time < 20000000) { 
       setTimeout(function() { check_status(time, div_id, filename); }, time); 
      } 
     } 
     } 
    }); 

} 
+0

'async' 호출에 대한 좋은 지적. 나는 그것을 놓쳤다. –

1

당신은, setTimeoutcheck_status(...)를 호출하여 반환 된 값을 check_status을하지 통과해야합니다. 당신의 setTimeout에 대한 참조로주는 대신 함수를 호출

setTimeout(function() { 
    check_status(waittime, div_id, filename); 
}, waittime); 
0

"서버에 대한 재귀 호출"? 아니, 니가 그렇게 생각하지 않아.

세 단계로 진행하면 var max_waittime = 11000000; 생성되고 세 번 초기화됩니다. 당신이 아약스 호출이 asychronous 전화는 것을 이해하지 못하는 것처럼

은 아마 당신은 모든 http://api.jquery.com/jQuery.ajax/

0

첫째, 보이는 아약스 호출에 대한 시간 초과 값 (아약스 설정)을 설정할 수 있습니다. 그것을 호출하면 네트워킹 작업이 시작되고 나머지 코드는 계속 실행됩니다. 나중에 네트워킹 작업이 완료되면 성공 함수가 호출됩니다.

ajax 호출 결과에서 작동 할 수있는 유일한 위치는 성공 함수입니다. 성공 함수의 값을 반환 할 수는 없으며 어디에서나 사용할 수 있습니다. 가는 유일한 장소는 아약스 코드의 어딘가에 있습니다. ajax 호출의 결과를 사용하여 무언가를 수행해야하는 경우 success 함수에서 해당 작업을 올바르게 수행하거나 success 함수에서 다른 함수를 호출하여 반환 된 데이터를 전달해야합니다. 성공 함수에서 상태 값을 반환에 아무 소용이 없다

  1. :

    이 작동하지 않는 코드의 부분입니다. 반환 값이 삭제되는 아약스 함수를 제외하고는 아무데도 가지 않습니다.
  2. 이 코드 줄 if (status == 0 && waittime < 20000000){은 원하는 것을 수행하지 않습니다. ajax 호출이 비동기이기 때문에이 코드 행이 실행될 때 상태 값은 아직 ajax 호출에 의해 설정되지 않았습니다. 따라서 항상 0이므로 논리가 작동하지 않습니다. 성공 핸들러 내에서이 논리를 이동해야합니다.
  3. 다른 사람들이 말한대로 setTimeout에 대한 매개 변수는 올바르지 않습니다.함수를 실행 한 결과가 아니라 setTimeout에 함수를 전달해야합니다.

이 내가 제안하는 코드입니다 :

function check_status(time, div_id, filename) { 
    var max_waittime=11000000; 
    if (time < max_waittime){ 
     time=time+1000000; 
    } 

    $.ajax({ 
     type: "GET", 
     async: false, 
     url: "code_on_server_checking_file.php", 
     data: "f="+filename, 
     dataType: "text", 
     success: function(content) { 
      if (content) { 
       // stuff related to output of the result 
       if (time < 20000000){ 
        setTimeout(function() {check_status(time, div_id, filename)}, time); 
       } 
      } 
     } 
    }); 
} 

참고 아약스 결과 모든 처리가 성공 함수에서 이루어집니다 그리고 우리는 후 그 재 통화 check_status을의 setTimeout하는 익명 함수를 통과 시간 지연. setTimeout은 check_status가 얼마 후에 다시 호출되기 전에 반환 할 수 있기 때문에 실제로는 재귀가 아닙니다 (다른 언급 된 것처럼).