2011-11-21 2 views
2

다음은 메소드에서 래핑 된 간단한 ajax 호출입니다.javascript jquery ajax 성공시 객체 반환

MyNS.GetStringList = function (successCallback, failedCallback) { 
var methodUrl = serverUrl + "/GetStringList"; 
$.ajax({ 
    type: "GET", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    url: methodUrl, // Location of the service 
    data: {}, //Data sent to server 
    beforeSend: function (XMLHttpRequest) { 
     //ensures the results will be returned as JSON. 
     XMLHttpRequest.setRequestHeader("Accept", "application/json"); 
    }, 
    success: successCallback, 
    error: failedCallback 
}); 
} 

위의 메소드를 호출하는 메소드가 있습니다.

function GoGetTheStringList() { 
     var stringList; 
     stringList = MyNS.GetStringList(function (data) { return data.d; }, function (XmlHttpRequest, textStatus, errorThrown) { 
      alert("error"); 
     }); 

     alert(reasonsDictionary); // THIS IS UNDEFINED! 

    } 

첫 번째 메서드가 data.d 개체를 반환하도록하는 올바른 구문은 무엇입니까?

언제나 감사드립니다. Jon

답변

6

정말 할 수 없습니다. Ajax 호출은 비동기 적이므로 success 콜백이 호출되기 전에 메서드가 반환되었음을 의미합니다./보정

편집 : 당신은 할 수 있습니다 그것을 할,하지만 당신은 당신이 당신의 전체 응용 프로그램이 기다리고있을 것입니다 의미 동기 호출을 수행 할 것입니다 의미 false에 jQuery를 아약스에게 async 옵션을 설정해야합니다 돌아올거야. success이 호출 될 때 호출 할 함수에 콜백을 전달하는 것이 가장 좋습니다.

편집에 대한 응답 : 네, 문맥이 맞지 않으므로 정의되지 않습니다. 콜백 내부에서 데이터를 처리해야합니다. 그 시점에서 함수 B에서 함수 A의 결과로 데이터를 반환 할 수 없기 때문입니다. 콜백에서 콜백 함수를 호출해야합니다. 함수를 사용하여 가져온 데이터를 처리 할 수 ​​있습니다. 이 이러한 목적에 더 적합으로

var latestData; 
function getStuff(succeeded,failed) {...} 
function gotStuff(dataWrapper) { 
    latestData = dataWrapper.d; 
    doThingsWithStuffData(dataWrapper.d); 
} 

getStuff(gotStuff, function() { ... }); 
+0

return 문이없는 제 1 방법은 아무 것도 반환되지 도착입니다. success 메서드에서 return 문을 추가하는 것은 작동하지 않습니다. $ .ajax 호출 앞에 return을 추가하면 responseText 속성을 가진 jhqr 객체를 얻지 만 아직 반환하지 않았을 때 얼마나 안전한지를 확신 할 수 없습니다. – user1231231412

+0

죄송합니다. 나는 처음에 당신의 요지를 완전히 오해했습니다. 비동기 호출에서 복귀 할 수 없다는 것을 이해합니다. 그래서, 참조로 값 유형을 전달할 수있는 방법이 있습니까? 그래서 그 논리에 내 논리를 둘 필요가 없습니까? – user1231231412

+0

로직을 배치 할 필요가 없습니다. 내 답장을 확인하면 데이터를 처리 한 콜백 내부에서 데이터를 처리하기 위해 다른 함수를 호출하는 것을 볼 수 있습니다. 제쳐두고 기술적으로 모든 객체 매개 변수는 Javascript에서 참조로 전달됩니다. –

0

당신은 jQuery deffered를 사용할 수 있습니다.

MyNS.GetStringList = function() { 
var methodUrl = serverUrl + "/GetStringList"; 
return $.ajax({       // return here, this will returns a deffered object 
      type: "GET", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      url: methodUrl, // Location of the service 
      data: {} //Data sent to server 
     }); 
} 

당신은 dataType: 'json'가하는 일입니다

beforeSend: function (XMLHttpRequest) { 
      //ensures the results will be returned as JSON. 
      XMLHttpRequest.setRequestHeader("Accept", "application/json"); 
      }, 

을 할 필요가 없습니다, 서버의 응답에 무엇을 기대해야하는지에 관해서는 jQuery를 힌트를 제공합니다. 함수에서 다음

function GoGetTheStringList() { 
     var stringList; 
     $.when(MyNS.GetStringList()) 
     .done(function(data){ console.log(data.d); }); 
     .fail(function(data) { console.log('Request failed'); }); 
} 
관련 문제