2012-10-21 3 views
1

AJAX 호출에서받은 JSON 데이터를 기반으로 채워지는 JsTree가 있습니다. 다음은 AJAX 호출입니다.jQuery의 .ajax 함수에서 "success"를 반환해야합니다.

function sendQuery(){ 
    $.ajax({ 
     context: this, 
     url: 'http://localhost:8080/testMain', 
     type: 'GET', 
     dataType: 'text', 
     success: function(data) { 
         // ^^^^ Need for sendQuery() to return DATA 
       }, 
     error: function (xhr, ajaxOptions, thrownError){  
        alert('Error xhr : ' + xhr.status);  
        alert('Error thrown error: ' + thrownError);  
       } 
    }); 
} 

여기에는 범위 문제가 있음을 알고 있습니다. 자바 스크립트 변수는 선언 함수에 따라 정의됩니다. 나는 sendQuery()에서 리턴하는 방법을 모른다. JSON을 파싱 할 다른 함수의 매개 변수로 사용하고있다. JSON은 다른 트리를위한 매개 변수이다. 내가 자바에서 익숙한 것만큼이나 간단하지 않은 시계에서이 부분에 좌절감을 느꼈다. 도움을 많이 주셔서 감사 드리며 작동하는 경우 분명히 받아들입니다. 건배

EDIT # 1 : 그래, 대답에 따라, 나는이 방식으로 내 코드를 변경하면 데이터가 .ajax 함수에서 벗어날 수 있다고 믿습니다. 프로그램의 흐름으로 되돌려 놓는 방법에 대한 질문이 남아 있습니다.

function sendQuery(){ 
    $.ajax({ 
     context: this, 
     url: 'http://localhost:8080/testMain', 
     type: 'GET', 
     dataType: 'text', 
     success: getJson, 
     error: function (xhr, ajaxOptions, thrownError){  
      alert('Error xhr : ' + xhr.status);  
      alert('Error thrown error: ' + thrownError);  
     } 
    }); 
} 

function getJson(data){ 
    alert("Transmission Success."); 
    alert(data); 
    var obj = $.parseJSON(data); 
    alert("Parsing JSON Success."); 
    var apples = obj.apples; 
    alert(apples); 
    return apples; 
} 

이제 어떻게하면 트리의 데이터를 준비 할 호출 체인에 APPLES 변수를 가져올 수 있습니까?

데이터를 처리 할 함수에 APPLES 변수를 제공해야합니다.

편집 # 2 콜백을 사용하여 :

콜백의 아이디어 주위에 내 머리를 정리 나에게 두 번째했다. 여기 내가 그걸로 할 수 있었던 것이있다.

내 원래의 트리 코드는 여러 가지 기능을 수행하는 일련의 함수를 호출하지만 궁극적으로 트리가 허용 할 형식으로 데이터를 가져옵니다.

$(function() {  
    $("#client_tree").jstree({ 
     "json_data": {"data": attachTree(stageTreeData(getJson(sendQuery())))}, 
     "plugins" : [ "themes", "json_data", "ui" ] 
    }).bind("select_node.jstree", function (e, data) { 
     var msg = data.rslt.obj.attr("id"); 
     alert(msg); 
    }); 
}); 

나는 순간

지금은 전화를 해달라고, 내가 약간 변경

] ... 방법은 다음 데이터 등로에서 반환()을 sendQuery에서, Ajax를 통해 데이터를 얻기 위해 노력하고 있어요 sendQuery(), jQuery가 호출합니다.

$(function(){ 
    $.ajax({ 
     context: this, 
     url: 'http://localhost:8080/testMain', 
     type: 'GET', 
     dataType: 'text', 
     success: loadTree, 
     error: function (xhr, ajaxOptions, thrownError){  
      alert('Error xhr : ' + xhr.status);  
      alert('Error thrown error: ' + thrownError);  
     } 
    }); 
}); 

또한 나는 오류, 예외없이이없고 나무가 채워집니다 내 나무 로딩 코드를 조금 ...

function loadTree(data){ 
    $("#client_tree").jstree({ 
     "json_data": {"data": attachTree(stageTreeData(getJson(data)))},  
     "plugins" : [ "themes", "json_data", "ui" ] 
    }).bind("select_node.jstree", function (e, data) { 
     var msg = data.rslt.obj.attr("id"); 
     alert(msg); 
    }); 

} 

을 변경했습니다.

도움 주셔서 감사합니다.

편집 # 3 약간의 물건을 고정 :

이전 Alert() call in jQuery not displaying, called from within a JsTree

답변

1

(이 함수를 호출하는 사람들에 대한 몇 가지 가정을 만들기). 이 코드가 보여주는 다른 함수를 사용할 수 있습니다.

function sendQuery(){ 
     $.ajax({ 
      context: this, 
      url: 'http://localhost:8080/testMain', 
      type: 'GET', 
      dataType: 'text', 
      success: loadTree, 

      error: function (xhr, ajaxOptions, thrownError){  
         alert('Error xhr : ' + xhr.status);  
         alert('Error thrown error: ' + thrownError);  
        } 
     }); 
    } 


function loadTree(data){ 
    /* do something with data returned from ajax*/ 

} 
+0

오, 그렇다면 성공과 같은 함수를 전달하면 : functionName은 함수에 데이터를 다시 전달합니다. 그게 최고야. 정말 고마워. 아프다. –

+1

yes ..'success : functionName'은'success : function (data) {functionName (data)} '와 똑같이 동작 할 것입니다. – charlietfl

+0

방금 ​​질문을 수정했습니다.이 데이터를 함수 호출에 보내야합니다. 잠시 시간을내어 확인해주세요. 감사합니다 –

3

없음에, 당신은 필요하지 않습니다.

필요한 것은 데이터를 사용하는 것입니다.

하지만 호출이 비동기 적이기 때문에 sendQuery에서 반환 할 수 없습니다. 이는 sendQuery가 반환 된 후에 만 ​​데이터를 사용할 수 있다는 것을 의미합니다.당신이 무슨 말을 하려는지와

function sendQuery(callback){ 
    ... 
    success: callback, 
    ... 
} 

... 
sendQuery(function(data){ 
    // do things with data 
}); 
+0

좋아, 그래서 실제로해야 할 일은 sendQuery()를 호출하고 응답을 저장하는 것입니다. 그런 다음 값을 반환하는 다른 함수를 호출하십시오. 권리? –

+0

당신은'sendQuery'를 호출해야하고'sendQuery'는 다른 함수를 호출 할 것입니다. –

-2
function sendQuery(){ 
    var val; 
    $.ajax({ 
     context: this, 
     url: 'http://localhost:8080/testMain', 
     type: 'GET', 
     async: false, 
     dataType: 'text', 
     success: function(data) { 
         val = data; 
       }, 
     error: function (xhr, ajaxOptions, thrownError){  
        alert('Error xhr : ' + xhr.status);  
        alert('Error thrown error: ' + thrownError);  
       } 
    }); 
    return val; 
} 
+2

async : false를 사용하지 마십시오. 더 이상 사용되지 않으며 브라우저를 차단하며 항상 매우 나쁜 아이디어였습니다. –

2

문제 :

이 솔루션은 sendQuery 기능 당신은 그들이 사용할 수있어 데이터로 수행 할 작업을 할 것입니다 콜백을 제공하는 것입니다 do는 ajax 호출이 비동기 적이라는 것입니다. 서버로부터 응답을 받기 전에 sendQuery 함수가 리턴되고 제어 흐름이 계속됩니다.

콜백을 사용하는 방법입니다. 서버에서 응답을 받으면 success()으로 전달한 함수가 호출됩니다. 기본적으로, 당신은 그 기능이 필요하다. 이 함수가 json, "tree for stage"등의 응답을 구문 분석하기를 원합니다.

전화를 걸기 전에 무슨 일이 일어 났는지를 호출하는 함수를 분리해야합니다. 전화가 다시 온 후에. "그 밖의 모든 것"은 성공 콜백에서 원하는 것입니다.

예 당신은 AJAX 성공 내의 데이터를 소비 할 필요가

function doQueryAndParseData(){ //This is the function that calls doQuery 
    prepare_something(); 
    //You pass this in as a callback, since it can only happen once you have data 
    sendQuery(function(data){  
     parsed_data = JSON.parse(data); //This is where you do your work 
     //Put parsed data into dom somehow 
    } 
    return; //This function will return before the data gets back, but when the server responds the data will get parsed and put into the tree 
} 

function sendQuery(callback){ 
    $.ajax({ 
     context: this, 
     url: 'http://localhost:8080/testMain', 
     type: 'GET', 
     dataType: 'text', 
     success: callback, 
     error: function (xhr, ajaxOptions, thrownError){  
        alert('Error xhr : ' + xhr.status);  
        alert('Error thrown error: ' + thrownError);  
       } 
    }); 
}  
+0

당신의 대답을 좋아해요, 전화가 왔을 때 성공 결과를 돌려 줄 다른 기능 안에서 호출을 감쌀 수 있을지도 모릅니다. 고마워 –

+0

doQueryAndParseData()가 필요한 경우 parsed_data를 반환하기 위해 또 다른 콜백이 필요합니까? –

+1

함수 호출을 네트워크로 보내서 파싱 된 데이터를 반환하는 방법은 없습니다 (async : false는 제외하고 페이지의 나머지 부분을 멈추게하기 때문에 수행하지 않으려합니다). 그 이유는 자바 스크립트가 돌아올 때까지 (최상위 이벤트 또는 페이지로드에서) 네트워크 호출이 완료되지 않기 때문입니다. 자바 스크립트를 효과적으로 작성하려면 호출의 모양뿐만 아니라 전반적인 프로그램 구조에 영향을주는 비동기 IO 스타일을 사용해야합니다. – Eric

관련 문제