2011-01-02 5 views
9

나는이 문제를 안다고 확신하지만, 며칠 동안은 여전히 ​​해결하려고 노력 중이다. 나는 물건을 많이 시도했지만 아무도 일하지 :jquery ajax return : undefined

여기 1을 보여줍니다 코드

function lobbyLeader() { 
    $.ajax({ 
     data: {"id": 1, "request": "lobbyinfo", "method": "read"}, 
     url: 'api.php', 
     dataType: 'json', 
     success: function(data){ 
      result = data.leader; 
      return result; 
     } 
    }); 
} 

alert(result);입니다하지만, 다른 기능에 사용하는 경우는 undefined을 말한다.

+0

"다른 기능에서 사용할 때"란 무엇을 의미합니까? –

+0

'alert (lobbyLeader());'하고'undefined'를 되찾고 있습니까? –

+0

"경고 (lobbyLeader())를하고 계시 며 다시 정의되지 않았습니다." 예 – Nightbox

답변

8

비동기 함수에서 return을 사용할 수 없다면 부모 함수가 아닌 success 콜백 함수에서 돌아올 것입니다.

가 비동기 적으로 실행되는 익명 함수 내에서 당신 return 값, 범위 체인을 전달 될 수 없습니다 그 값의 return 문이 아니라
function lobbyLeader() { 
    $.ajax({ 
    data: {"id": 1, "request": "lobbyinfo", "method": "read"}, 
    url: 'api.php', 
    dataType: 'json', 
    success: function(data){ 
     someOtherFunc(data.leader); 
    } 
}); 
} 
+0

나는 두 기능을 병합했습니다 : http://pastebin.com/runiGzsd 당신이 정말로 그것을 고칠 수 말해 줄래? – Nightbox

+0

@Nightbox -'if (function.leader) {'대신'if (data.leader) {'가 필요합니다. –

+0

Uncaught SyntaxError : 예기치 않은 토큰 == http://pastebin.com/DN8Zk34G – Nightbox

4

여기 AJAX는 비동기식입니다 (첫 번째 A가 의미하는 것임). 즉, 함수는 즉시 반환됩니다. success 핸들러는 요청이 성공적 일 때만 호출됩니다. 즉, 요청을 한 직후 lobbyLeader이 반환되므로 아무 것도 반환하지 않습니다.

데이터를받은 후에 실행해야하는 코드가있는 경우 success 처리기 (또는 another AJAX event handler)에 삽입하거나 코드를 호출해야합니다.

1

때 대신,이 같은 콜백에 필요한 어떤 킥오프 주변 범위가 아닌 현재 함수 범위에 적용된 경우 $.ajax()은 비동기이므로 명령문을 실행 한 직후 외부 함수가 반환되므로 외부 함수의 반환 값이 없습니다. 따라서 undefined이 발생합니다.

$.ajax에 전달 된 콜백 함수에서 가능한 반환 값에 연결하는 유일한 방법은 다른 외부 함수를 호출하여 원하는 데이터를 전달하는 것입니다.

2

이렇게하는 것이 좋습니다.

  1. async : a false로 ajax 호출을 사용합니다.
  2. ajax 호출 후 return 문을 이동하십시오.

예 :

function makeJQGridDataFromList(url) 
{ 
    var rowData; 
    var viewPage = 0; 
    var viewTotal = 0; 
    var viewRecords = 0; 

    var resultObject; 

    $.ajax({  
     type:"GET", 
     url:url,  
     async: false, 
     success:function(args){ 
      if(args.result==true) 
      { 
       try 
       { 
        viewPage = args.cond.pageIndex; 
        viewTotal = args.cond.recordCountPerPage; 
        viewRecords = args.cond.totalCnt; 

        rowData = jsonMakeRowsForGrid(args.data); 
       } 
       catch (e) 
       { 
        console.debug("Error!"); 
        alert("Invalid data"); 
        return; 
       } 
      } else 
      { 
       alert("API return ERROR!"); 
       return; 
      } 
     }, 
     error:function(e){ 
      alert("Fail AJAX communication"); 
      return; 
     } 
    }); 

    resultObject = { 
     page : viewPage, 
     total : viewTotal, 
     records : viewRecords, 
     rows : rowData 
    }; 

    return(resultObject); 
} 

다음과 같은 방법을 테스트 할 수 있습니다.

var gridData = makeJQGridDataFromList(openAPIUrl); 
console.debug(">> " + JSON.stringify(gridData)); 

당신은 gridData을 볼 수 있습니다 (다른 파일 (HTML이나 JS)에서)

.

동일한 문제가 발생했습니다.:)

1

실제로 성공에서 돌아올 수는 없다고 정확하게 말했지만, 내가하고있는 일을하고 있다면 데이터를 가져 와서 다른 영역의 무언가에 할당하는 것입니다. IE

var obj = lobbyLeader();

그러면 함수를 async : false로 설정하고 코드 실행 완료 후 obj를 Success 외부에서 반환 할 수 있습니다. 예를

function lobbyLeader() { 
var obj; 
    $.ajax({ 
    async:false; 
    data: {"id": 1, "request": "lobbyinfo", "method": "read"}, 
    url: 'api.php', 
    dataType: 'json', 
    success: function(data){ 
     obj= JSON.parse(data); 
    } 
}); 
    return obj; 
} 

스크립트를 설정하고 반환 후 성공을 위해 기다리는 중지하고이 방법.

+0

"jQuery 1.8 [3 년 전!] as async 사용 : jqXHR ($ .Deferred)는 더 이상 사용되지 않으므로 jqXHR.done() 또는 deprecated jqXHR.success()와 같은 jqXHR 객체의 해당 메소드 대신 success/error/complete 콜백 옵션을 사용해야합니다. http://api.jquery.com/jQuery.ajax/ 약속을 배우는 것이 그렇게 어렵지는 않습니다. 확실히 요청이 완료 될 때까지 전체 UI를 차단하는 기능이 향상되었습니다. –