2012-06-26 2 views
3

가능한 중복 : 나는 WCF 중 하나로, OData 서비스로 이동하고 일부 데이터를 얻을 다음과 같은 자바 스크립트 루틴을 만든
Is it posible to use ajax respone outside of it?JavaScript/JQuery의 범위 문제입니까?

. success 요소에서 결과 변수에 결과를 가져 와서 경고합니다. 반환되는 객체가 있음을 알 수 있습니다. 두 번째 경고를 실행하면 아약스 호출 외부에서 결과를 반환하기 전에 결과 변수가 "정의되지 않음"입니다.

아무도 내가 잘못 가고 있다고 말할 수 있습니까?

function retrieveJsonpODataSet(baseUrl, query) 
{ 
    var oDataUrl = baseUrl + "?$format=json&$callback=?"; 
    var results; 

    $.ajax(
    { 
    url: oDataUrl, 
    contentType: 'application/json; charset=utf-8', 
    type: 'GET', 
    dataType: 'jsonp', 
    async: false, 
    success: 
     function (data, textStatus, xhr) 
     { 
      results = data.d; 
      alert(results); // This shows the results 
     }, 
    error: 
     function (xhr, textStatus, errorThrown) 
     { 
      alert("Query failed.\n\n" + oDataUrl + "\n\n" + errorThrown); 
      results = null; 
     } 
    }); 
    alert(results); // This shows "undefined" 
    return results; 
} 

쿼리 매개 변수를 무시하십시오. 아직 루틴을 완료하지 않았습니다.

편집은 처음에 나는 아약스 호출에는 async:false 없었다. 지금은 추가했지만 문제가 해결되지는 않습니다.

+4

** ** - 동기화. 누군가가 FAQ를 작성해 주실 수 있습니까? –

+0

@MukeshSoni 범위 문제는 아닙니다. –

+0

@Mukesh - 두 번째 부분에 맞습니다 ... 동기적인 문제입니다. 그러나 범위 문제는 아닙니다. 'Results'는 ajax 호출과 내부 클로저 전에 정의되어 있으며 범위는 유효합니다. –

답변

6

ajax 호출은 비동기 작업입니다. 화재가 발생하고 코드가 멈추지 않습니다. 그래서 results이 리턴되며, 그 시점에서 정의되지 않습니다. 당신이해야 할 일은 함수에 콜백을 전달하는 것입니다.

function retrieveJsonpODataSet(baseUrl, query, callback) { 
    /* some code */ 
    $.ajax({ 
     /* some settings */ 
     success: function(res) { 
      /* some code */ 
      callback(results); 
     } 
    }); 
} 

이제 async: false OPTION을 사용하지 마십시오이

retrieveJsonpODataSet(baseUrl, query, function(res) { 
    /* Hurray, I have result now in res variable! */ 
}); 

처럼 사용! 전화가 끝날 때까지 ALL 스크립트를 차단하고 ... 완료되지 않으면 어떻게해야합니까 ?? 너는 영원히 막힐 것이다.

편집

나는 요청 JSONP 것을보고 싶었어요. 이 경우 async: false은 작동하지 않습니다 (도메인 간 요청 및 JSONP에서는 작동하지 않습니다). 어쨌든 콜백을 사용해야합니다.

+0

이 데이터를 반환하는 함수를 만드는 방법이 있습니까? 몇 가지 기존 소프트웨어를 기반으로 작동하도록 특정 기능 구문을 가지고있어 플러그인 기능을 만들었으며 해당 소프트웨어로 작성된 호출을 변경할 수 없습니다. – Richard

+0

'async : false'가 없으면 그런 가능성이 없습니다. 기존 소프트웨어가 사용하도록 강요하면 소프트웨어가 실제로 잘못 작성됩니다. 또는 잘못 사용하십시오. 소프트웨어를 사용하기 전에 * 호출을 시작하고'retrieveJsonpODataSet' 콜백 함수 내에서 소프트웨어를 사용할 수 있습니다. – freakish

+0

나쁘게 쓰여진 것을 나는 모른다. 자바 스크립트를 사용하여 전화를 걸고 결과를 얻을 수 있기를 기대합니다. 나는 이것을 다른 것으로 만들기 위해 소스 코드에 접근 할 수 없다. – Richard

1

귀하의 ajax는 비동기식이므로, 경고는 ajax가 완료되기 전에 실행됩니다. ajax 요청이 처리 될 때까지 스크립트가 실행을 중지 시키려면 ajax 호출 async 속성을 false로 설정해야합니다. &.

그러나, jQuery를 워드 프로세서는 말한다 :

비동기 기본 : 사실 은 기본적으로 모든 요청 (즉이 기본적으로 true로 설정) 비동기 전송됩니다. 동기 요청이 필요한 경우이 옵션을 false로 설정하십시오. 도메인 간 요청 및 데이터 유형 : "jsonp"요청은 동기 작업을 지원하지 않습니다. 동기 요청은 일시적으로 브라우저를 잠그고 요청이 활성화되어있는 동안 작업을 비활성화 할 수 있습니다. jQuery 1.8부터는 async : false 사용이 권장되지 않습니다.

+0

방금 ​​업데이트했는데 문제는 해결되지 않았습니다. – Richard

+0

전화를 동기식으로 설정하지 않는 것이 좋습니다. 올바르게하는 것이 더 낫습니다. –

5

동료 Richard!

이것은 범위 문제가 아니지만 실행 문제 중 하나입니다. successerror 옵션은 모두 이벤트 핸들러이며 비동기 적으로 실행됩니다 (따라서 AJAX라고 함). 즉, success 또는 error 이벤트가 트리거되기 전에 alert(results)return results이 실행될 가능성이 있으며, 실제로 실행될 가능성이 높습니다.

+0

* 가능성이 있습니다. 자바 스크립트는 단일 스레드이므로 이벤트가 트리거되기 전에 항상 * 실행됩니다. – freakish

1

응답을 기다리는 스크립트없이 AJAX 요청이 전송됩니다. 즉, Dave Newton의 의미는 A-synchronus이며 성공 콜백 함수 내에 경고를 넣으면 실제 응답이 무엇인지 알 수 있습니다.

또는 async 속성을 지정하고 false으로 설정하여 스크립트가 응답을 기다리게 한 다음 계속하기 만하면됩니다.

+1

아니요, jsonp 요청입니다. 어쨌든 나쁜 조언. –

+0

나는'async : false'에 대한 팬이 아니지만, 단지 디버그 퍼 버튼을위한 것이라해도 여전히 사용될 수 있습니다. 하지만 jsonp라는 요청을 간과했다. –

관련 문제