JSONP를 사용할 때 jQuery $ .getJson (또는 'JSONP'로 설정된 $ .ajax) 오류를 어떻게 잡아려면?

StackOverflow https://stackoverflow.com/questions/309953

  •  08-07-2019
  •  | 
  •  

문제

jQuery와 함께 JSONP를 사용할 때 오류를 잡을 수 있습니까? $ .getJson과 $ .Ajax 메소드를 모두 시도했지만 테스트중인 404 오류를 포착하지는 않습니다. 다음은 내가 시도한 내용입니다 (이 모든 것이 성공적으로 작동하지만 실패 할 때 케이스를 처리하고 싶습니다).

jQuery.ajax({
    type: "GET",
    url: handlerURL,
    dataType: "jsonp",
    success: function(results){
        alert("Success!");
    },
    error: function(XMLHttpRequest, textStatus, errorThrown){
        alert("Error");
    }
});

그리고 또한:

jQuery.getJSON(handlerURL + "&callback=?", 
    function(jsonResult){
        alert("Success!");
    });

또한 $ .AjaxError를 추가하려고 시도했지만 작동하지 않았습니다.

jQuery(document).ajaxError(function(event, request, settings){
   alert("Error");
});

답장에 미리 감사드립니다!

도움이 되었습니까?

해결책

성공적인 결과를 반환하지 않는 JSONP 요청은 이벤트, 성공 또는 실패를 유발하지 않으며, 더 나은 디자인에 의해 더 나쁘거나 악화되는 것 같습니다.

버그 추적기를 검색 한 후에 있습니다 패치 타임 아웃 콜백을 사용하여 가능한 솔루션 일 수 있습니다. 보다 버그 보고서 #3442. 오류를 캡처 할 수 없으면 합리적인 시간을 기다린 후에 최소한 타임 아웃을 할 수 있습니다.

다른 팁

여기비슷한 질문에 대한 나의 광범위한 대답입니다.

코드는 다음과 같습니다.

jQuery.getJSON(handlerURL + "&callback=?", 
    function(jsonResult){
        alert("Success!");
    })
.done(function() { alert('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { alert('getJSON request failed! ' + textStatus); })
.always(function() { alert('getJSON request ended!'); });

JSONP 문제 감지

종속성을 다운로드하지 않으려면 오류 상태를 직접 감지 할 수 있습니다. 그것은 간단합니다.

시간 초과를 사용하여 JSONP 오류 만 감지 할 수 있습니다. 특정 시간에 유효한 응답이 없으면 오류를 가정하십시오. 그래도 오류는 기본적으로 무엇이든 할 수 있습니다.

오류를 확인하는 간단한 방법은 다음과 같습니다. 그냥 사용하십시오 success 깃발:

var success = false;

$.getJSON(url, function(json) {
    success = true;
    // ... whatever else your callback needs to do ...
});

// Set a 5-second (or however long you want) timeout to check for errors
setTimeout(function() {
    if (!success)
    {
        // Handle error accordingly
        alert("Houston, we have a problem.");
    }
}, 5000);

의견에 언급 된 TheDawnrider가 대신 Cleartimeout을 사용할 수도 있습니다.

var errorTimeout = setTimeout(function() {
    if (!success)
    {
        // Handle error accordingly
        alert("Houston, we have a problem.");
    }
}, 5000);

$.getJSON(url, function(json) {
    clearTimeout(errorTimeout);
    // ... whatever else your callback needs to do ...
});

왜요? 읽어...


JSONP가 간단히 작동하는 방법은 다음과 같습니다.

JSONP는 일반 AJAX 요청과 같이 XMLHTTPREQUEST를 사용하지 않습니다. 대신, 그것은 a를 주입합니다 <script> "SRC"속성이 요청의 URL 인 페이지에 태그. 응답의 내용은 JavaScript 함수로 래핑 한 다음 다운로드하면 실행됩니다.

예를 들어.

JSONP 요청 : https://api.site.com/endpoint?this=that&callback=myFunc

JavaScript는이 스크립트 태그를 DOM에 주입합니다.

<script src="https://api.site.com/endpoint?this=that&callback=myFunc"></script>

a <script> 태그가 DOM에 추가 되었습니까? 분명히, 그것은 실행됩니다.

따라서이 쿼리에 대한 응답이 다음과 같은 JSON 결과를 산출했다고 가정합니다.

{"answer":42}

브라우저에는 스크립트의 소스와 같은 것이므로 실행됩니다. 그러나 이것을 실행할 때 어떻게 되는가 :

<script>{"answer":42}</script>

글쎄, 아무것도. 그것은 단지 대상 일뿐입니다. 저장, 저장되지 않으며 아무 일도 일어나지 않습니다.

이것이 JSONP가 결과를 함수로 래핑하는 이유입니다. JSONP 직렬화를 지원 해야하는 서버는 callback 지정한 매개 변수를 대신 반환합니다.

myFunc({"answer":42})

그런 다음 대신 실행됩니다.

<script>myFunc({"answer":42})</script>

... 훨씬 더 유용합니다. 이 경우 코드 어딘가에는 전역 기능입니다. myFunc:

myFunc(data)
{
    alert("The answer to life, the universe, and everything is: " + data.answer);
}

그게 다야. 그것이 JSONP의 "마법"입니다. 그런 다음 시간 초과 확인을 구축하는 것은 위와 같이 매우 간단합니다. 요청을 작성하고 즉시 타임 아웃을 시작하십시오. x 초 후에 깃발이 아직 설정되지 않은 경우 요청이 시간이 내려졌습니다.

나는이 질문이 조금 오래되었다는 것을 알고 있지만 문제에 대한 간단한 해결책을 제시하는 대답을 보지 못했기 때문에 '간단한'솔루션을 공유 할 것이라고 생각했습니다.

$.getJSON("example.json", function() {
      console.log( "success" );
}).fail(function() { 
      console.log( "error" ); 
}); 

우리는 단순히 사용할 수 있습니다 .fail() 오류가 발생했는지 확인하기 위해 콜백.

도움이 되었기를 바랍니다 :)

공급자와 공동 작업하면 오류가 발생할 때 다른 쿼리 문자열 매개 변수가 콜백 기능으로 보낼 수 있습니다.

? 콜백 =? & error =?

이것을 JSONPE라고하지만 전혀 Defacto 표준은 아닙니다.

그런 다음 제공자는 정보를 오류 기능으로 전달하여 진단에 도움이됩니다.

Comm 오류에 도움이되지는 않지만 Adam Bellaire의 답변에서와 같이 jQuery가 타임 아웃에서 오류 함수를 콜백하기 위해 업데이트되어야합니다.

지금 작동하는 것 같습니다.

jQuery(document).ajaxError(function(event, request, settings){
   alert("Error");
});

나는 이것을 사용하여 JSON 오류를 포착합니다

try {
   $.getJSON(ajaxURL,callback).ajaxError();
} catch(err) {
   alert("wow");
   alert("Error : "+ err);
}

편집하다: 또는 오류 메시지도 얻을 수 있습니다. 이것은 오류가 정확히 무엇인지 알려줄 것입니다. 캐치 블록에서 구문을 따르십시오

alert("Error : " + err);

Mayby이 효과가 있습니까?

.complete(function(response, status) {
    if (response.status == "404")
        alert("404 Error");
    else{
        //Do something
    }   
    if(status == "error")
        alert("Error");
    else{
        //Do something
    }
});

상태가 "오류"모드로 들어올 때마다 모릅니다. 그러나 나는 그것을 404로 테스트했고 응답했다

AJAX 요청 에이 속성을 추가하여 오류 번호를 명시 적으로 처리합니다.

statusCode: {
        404: function() {
          alert("page not found");
        }
    }

따라서 코드는 다음과 같아야합니다.

jQuery.ajax({
type: "GET",
statusCode: {
        404: function() {
          alert("page not found");
        }
},
url: handlerURL,
dataType: "jsonp",
success: function(results){
    alert("Success!");
},
error: function(XMLHttpRequest, textStatus, errorThrown){
    alert("Error");
}
});

이것이 도움이되기를 바랍니다 :)

나는 또한이 답을 게시했습니다 스택과다 - GetJson 호출의 오류 처리

누군가가 여기에 대답하고 포스터가 이미 여기나 다른 곳에서 그의 대답을 얻었을 때 나는 시간이 오래되었다는 것을 알고 있습니다. 그러나이 게시물은 GetJSON 요청을 수행하는 동안 오류 및 시간 초과를 추적 할 수있는 방법을 찾는 데 도움이 될 것이라고 생각합니다. 그러므로 질문에 대한 나의 대답 아래

getjson 구조는 다음과 같습니다 (찾을 수 있습니다 http://api.jqueri.com):

$(selector).getJSON(url,data,success(data,status,xhr))

대부분의 사람들은이를 사용하여 구현합니다

$.getJSON(url, datatosend, function(data){
    //do something with the data
});

그들이 URL var를 사용하여 JSON 데이터에 대한 링크를 제공하는 곳, 데이터를 추가 할 장소로서 "?callback=?" 올바른 JSON 데이터를 얻기 위해 보내야하는 다른 변수와 데이터 처리 기능으로서 성공적인 기능.

그러나 성공 함수에 상태 및 XHR 변수를 추가 할 수 있습니다. 상태 변수에는 다음 문자열 중 하나가 포함되어 있습니다. "성공", "노동식", "오류", "타임 아웃"또는 "parsererror"및 XHR 변수에는 리턴 된 XMLHTTPREQUEST 객체가 포함됩니다.W3Schools에서 발견됩니다)

$.getJSON(url, datatosend, function(data, status, xhr){
    if (status == "success"){
        //do something with the data
    }else if (status == "timeout"){
        alert("Something is wrong with the connection");
    }else if (status == "error" || status == "parsererror" ){
        alert("An error occured");
    }else{
        alert("datatosend did not change");
    }         
});

이렇게하면 요청이 완료되면 시작된 사용자 정의 타임 아웃 추적기를 구현하지 않고도 타임 아웃 및 오류를 쉽게 추적 할 수 있습니다.

이것이 여전히이 질문에 대한 답을 찾는 사람이 도움이되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top