2013-06-13 2 views
0

내 페이지에 양식이 있습니다. 사용자가 보내기 버튼을 눌렀을 때 백그라운드에서이 번호를 생성하는 함수를 호출하여 unique_number를 생성하고 DB에이 번호가 존재하지 않는지 검사합니다. 있는 경우 - 다시 생성하고, 그렇지 않으면 -이 숫자를 반환합니다. 그러나 어떤 이유로이 번호를 페이지에 인쇄하려고 할 때 또는 경고 할 때 - 함수가 숫자를 반환하지만 undefined이 표시됩니다.함수를 호출하면 '정의되지 않음'이 반환됩니다.

var unique_num = create_unique_number(); 
alert(unique_num); 
    rest of this function... 

을 그리고 여기에 함수 자체입니다 : 여기 함수에 대한 호출의

function create_unique_number() 
{ 
var num = Math.floor(Math.random() * (999999 - 100000 + 1)) + 100000; 

$.getJSON("inc/API.php", 
{ 
    command:"is_unique_number_exist", 
    unique_num:num 
}, 
    function(result){ 
     if(result==true){ 
      create_unique_number(); 
     } 
     else 
     { 
      return num; 
     } 
    }); 
} 

나는 그것이 사실이라면, 결과를 얻는다 - 그것은 새 번호를 생성, 거짓 경우는 - 반환해야합니다. 나는 alert 부분에 else 부분에있는 숫자를 시도했지만, 그 번호는 경고했지만 반환시에는 정의되지 않았습니다. 왜 그런 일이 일어나고 어떻게 해결할 수 있습니까? 이연 개체를 사용하여 솔루션을

+0

getJson의 콜백 함수 만 num을 반환하고 create_unique_number 함수에는 반환 값이 없습니다. –

+3

부수적으로, 서버 쪽에서 고유 번호를 선택하는 것이 더 빠를 것입니다. 사용되는 네트워크가 적어 서버에서 비슷한 작업량. – Liosan

+0

이 사이트가 "가까운 투표를 철회"옵션을 갖기를 바랍니다.이 함수의 재귀 부분은 솔루션을 매우 재미있게 만듭니다. – Alnitak

답변

1

,이 시도 : 나는 당신의 API를 사용할 수없는 것처럼 이것은 물론 안된

function create_unique_number() 
{ 
    var num = Math.floor(Math.random() * (999999 - 100000 + 1)) + 100000; 

    return $.getJSON("inc/API.php", { 
     command:"is_unique_number_exist", 
     unique_num:num 
    }).then(function(result) { 
     return result ? create_unique_number() : num; 
    }); 
} 

하지만 이론은 그 resulttrue.then 호출하는 경우 재귀 호출의 결과를 동일한 함수로 반환합니다. resultfalse이면 선택한 약속 번호를 새로운 약속의 (해결 된) 결과로 반환합니다. 어떤 AJAX 호출이 실패 할 경우

, 루프가 중단해야하고 당신이 할 수있는 트랩하는 .fail 호출로 : 재귀 호출이 아니라는 것을

create_unique_number().done(function(n) { 
    // use your unique number "n" here 
    var unique_num = n; 
    ... 
}).fail(function() { 
    // there was an AJAX error 
}); 

// can't use "unique_num" here - execution continues here immediately 
// and "unique_num" isn't defined until the above ".done" callback is 
// invoked some time later 

진정으로 재귀 - AJAX 이벤트 구동되기 때문에, 원래 함수는 이미 종료되었고 AJAX .then 이벤트가 발생하기 훨씬 전에 해당 스택을 정리했습니다. create_unique_number에 대한 새로운 호출은 원래 호출과 동일한 "호출 스택"레벨에있게됩니다.

또한 의견에서 지적한대로 실제로 서버가 임의의 숫자를 제공하는 것이 훨씬 간단합니다.

+0

답을 따르려고하지만, 잘못하고있는 것 같아요 - 지금 [object object]'를 받고 있습니다 ... 내 API는 간단합니다 : BusinessLogic.php 파일에서 함수를 호출합니다 : 존재하지 않는다면 숫자가 존재하는 DB에서 raw를 선택하는 echo json_encode (true); else echo json_encode (false);'존재하지 않으면 True를 반환한다. 't - 거짓 :'{$ arr = select ("SELECT * FROM tbl WHERE unique_num ='$ num '"); return (count ($ arr)> 0);}'서버가 어떻게 6 자리 숫자 만 난수를 얻게하는지 모르겠습니다. PHP는 13 자, nums 및 문자를 제공합니다. – Igal

+0

@Igal은 최종 코드 예제에 따라'.done' 콜백에 전달 된'n'의 값이나'create_unique_number'의 반환 값 인'[object Object]'입니다. – Alnitak

+0

예, 반환 값입니다. – Igal

관련 문제