getJSON 호출에서 오류 처리


192

getJSON 호출에서 오류를 어떻게 처리 할 수 ​​있습니까? jsonp를 사용하여 도메인 간 스크립트 서비스를 참조하려고하는데 오류 방법을 어떻게 등록합니까?



Ajay, 정답 표시를 고려해 보지 않겠습니까?
Ionică Bizău

@ IonicăBizău 지금 표시했습니다. 나는 방금 이것을 추적하지 못했습니다. 가장 좋은 대답은 JSONP에 관한 것이 아닙니다. Ben Shelock이 지적한 것처럼 지원되는 오류 처리기가 없습니다 ..
Ajay

답변:


277

$.getJSON() JSON 인코딩 응답을 원한다는 것을 알려주는 일반적인 AJAX 호출의 추상화입니다.

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

일반적으로 (실제로 호출하기 전에 AJAX 호출을 구성하여) 또는 구체적으로 (메소드 체인 사용) 두 가지 방법으로 오류를 처리 할 수 ​​있습니다.

'일반'은 다음과 같습니다.

$.ajaxSetup({
      "error":function() { alert("error");  }
});

그리고 '구체적인'방법 :

$.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });

안돼! 당신이 원하는대로 갈 수 있습니다. 자세한 도움말은 다음 문서를 참조하십시오. http://api.jquery.com/jQuery.ajax
Luciano Costa

5
이 1.5 jQuery를 필요로합니다 (이것은 :-) 잘못된 방법에 대해 불평 한 이유는 / jQuery를 1.3 승 일하고 궁금려고 노력했다
kenyee

24
OP는 교차 사이트 JSONP에 대해 구체적으로 묻습니다 .이 getJSON경우 error()함수를 호출하지 않는 것 같습니다 . 같은 문제가 있습니다. 두 가지를 모두 처리 하면서도 JSONP일반 AJAX통화와 완전히 다른 방식 으로 처리되는 것과 관련이 있다고 생각합니다 . 은 객체 로 수행 되지만 페이지의에 태그를 동적으로 추가하여 수행됩니다 . jQuerygetJSONJSONXMLHTTPRequestJSONP<script>HEAD
hippietrail

3
jQuery Doc에 "참고 :이 핸들러는 도메인 간 스크립트 및 JSONP 요청에 대해 호출되지 않습니다." api.jquery.com/jQuery.ajax > 오류
OneWorld

10
"jQuery 1.5에 도입 된 jqXHR.success (), jqXHR.error () 및 jqXHR.complete () 콜백 메소드는 jQuery 1.8에서 더 이상 사용되지 않습니다. 최종 제거를 위해 코드를 준비하려면 jqXHR.done (), jqXHR을 사용하십시오. .fail () 및 jqXHR.always () 대신에. "
Skorunka František

86

누군가 Luciano에게 다음과 같은 점을 알려줍니다.) 방금 그의 대답을 테스트했습니다.

나는 심지어 50 센트를 추가합니다 :

.error(function(jqXHR, textStatus, errorThrown) {
        console.log("error " + textStatus);
        console.log("incoming Text " + jqXHR.responseText);
    })

3
교차 사이트 JSONP 또는 동일한 사이트 JSON이 있습니까?
hippietrail

28
좋은 대답입니다! .error에 대한 참고 사항 : jQuery 1.8에서 더 이상 사용되지 않으므로 .fail을
Anatoly Mironov

73

여기 제가 추가했습니다.

에서 http://www.learnjavascript.co.uk/jq/reference/ajax/getjson.html공식 소스

" jQuery 1.5에 도입 된 jqXHR.success (), jqXHR.error () 및 jqXHR.complete () 콜백 메소드는 jQuery 1.8에서 더 이상 사용되지 않습니다. 최종 제거를 위해 코드를 준비하려면 jqXHR.done (), jqXHR을 사용하십시오. .fail () 및 jqXHR.always () 대신 "

나는 그것을했고 여기 Luciano의 업데이트 된 코드 스 니펫이 있습니다.

$.getJSON("example.json", function() {
  alert("success");
})
.done(function() { alert('getJSON request succeeded!'); })
.fail(function() { alert('getJSON request failed! '); })
.always(function() { alert('getJSON request ended!'); });

그리고 오류 설명과 함께 모든 json 데이터를 문자열로 표시합니다.

$.getJSON("example.json", function(data) {
  alert(JSON.stringify(data));
})
.done(function() { alert('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { alert('getJSON request failed! ' + textStatus); })
.always(function() { alert('getJSON request ended!'); });

경고가 마음에 들지 않으면 console.log

$.getJSON("example.json", function(data) {
  console.log(JSON.stringify(data));
})
.done(function() { console.log('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { console.log('getJSON request failed! ' + textStatus); })
.always(function() { console.log('getJSON request ended!'); });

getJSON 내부의 완료, 실패, 항상 및 코드의 시간 순서는 무엇입니까?
TheLogicGuy

참고 : console.log는 IE7과 같은 구형 브라우저에서는 구현되지 않습니다! 당신이 그것을 사용하는 경우에 대비하여!
MadMad666

12

나는 누군가가 여기에 대답하고 포스터가 이미 여기 또는 다른 곳에서 그의 대답을 얻은 지 오래 된 것을 알고 있습니다. 그러나이 게시물은 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 데이터에 대한 링크를 제공하고 datatosend "?callback=?"는 올바른 JSON 데이터를 리턴하기 위해 전송해야하는 변수 및 기타 변수 를 추가하고 데이터 처리를위한 함수로서 성공 함수를 추가합니다. .

그러나 성공 함수에 status 및 xhr 변수를 추가 할 수 있습니다. 상태 변수에는 "성공", "수정되지 않음", "오류", "시간 초과"또는 "파서 오류"문자열 중 하나가 포함되며 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");
    }         
});

이렇게하면 요청이 완료되면 시작되는 사용자 지정 시간 초과 추적기를 구현하지 않고도 시간 초과 및 오류를 쉽게 추적 할 수 있습니다.

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


2
작동하지 않습니다. "성공"콜백은 이름에서 알 수 있듯이 성공시에만 호출됩니다. (따라서 "status"매개 변수가 무엇인지 확실하지 않습니다 ...)
jwelsh

4

$.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })

jQuery 2.x에서 수정되었습니다. jQuery 1.x에서는 오류 콜백이 발생하지 않습니다.


1

나는이 같은 문제에 직면했지만 실패한 요청에 대한 콜백을 생성하는 대신 json 데이터 객체에 오류를 반환했습니다.

가능하다면 가장 쉬운 해결책 인 것 같습니다. 다음은 내가 사용한 Python 코드 샘플입니다. (Flask, Flask의 jsonify f 및 SQLAlchemy 사용)

try:
    snip = Snip.query.filter_by(user_id=current_user.get_id(), id=snip_id).first()
    db.session.delete(snip)
    db.session.commit()
    return jsonify(success=True)
except Exception, e:
    logging.debug(e)
    return jsonify(error="Sorry, we couldn't delete that clip.")

그런 다음 Javascript를 다음과 같이 확인할 수 있습니다.

$.getJSON('/ajax/deleteSnip/' + data_id,
    function(data){
    console.log(data);
    if (data.success === true) {
       console.log("successfully deleted snip");
       $('.snippet[data-id="' + data_id + '"]').slideUp();
    }
    else {
       //only shows if the data object was returned
    }
});

이는 서버 내에서 발생하는 오류에는 적합하지만 호출이 서버에 도달 할 수 없거나 MVC 사용자가 더 이상 인증되지 않은 경우와 같이 서버 코드에 도달하기 전에 오류가 발생하면 캡처되지 않습니다.
Lee Oades

1

왜 안돼?

getJSON('get.php',{cmd:"1", typeID:$('#typesSelect')},function(data) {
    // ...
});

function getJSON(url,params,callback) {
    return $.getJSON(url,params,callback)
        .fail(function(jqXMLHttpRequest,textStatus,errorThrown) {
            console.dir(jqXMLHttpRequest);
            alert('Ajax data request failed: "'+textStatus+':'+errorThrown+'" - see javascript console for details.');
        })
}

??

사용 된 .fail()방법 (jQuery 1.5 이상) 에 대한 자세한 내용 은 http://api.jquery.com/jQuery.ajax/#jqXHR을 참조하십시오.

jqXHR는 함수에 의해 반환 되므로 체인과 같은

$.when(getJSON(...)).then(function() { ... });

가능합니다.


0

경우에 따라이 방법과의 동기화 문제가 발생할 수 있습니다. setTimeout함수 내에 콜백 호출을 작성 했으며 동기식으로 잘 작동했습니다 =)

EG :

function obterJson(callback) {


    jqxhr = $.getJSON(window.location.href + "js/data.json", function(data) {

    setTimeout(function(){
        callback(data);
    },0);
}

0

이것은 꽤 오래된 스레드이지만 Google 검색에 표시되므로 약속을 사용하여 jQuery 3 답변을 추가 할 것이라고 생각했습니다. 이 스 니펫은 다음을 보여줍니다.

  • 베어러 토큰을 전달하기 위해 더 이상 $ .ajax로 전환 할 필요가 없습니다.
  • .then ()을 사용하여 모든 결과를 동 기적으로 처리 할 수 ​​있습니다 ( 100 % 사실인지 확실하지는 않지만 .always () 콜백이 너무 빨리 발생했습니다. )
  • .always ()를 사용하여 긍정적이든 부정적이든 단순히 결과를 보여줍니다.
  • .always () 함수에서 HTTP 상태 코드와 메시지 본문으로 두 개의 대상을 업데이트하고 있습니다.

코드 스 니펫은 다음과 같습니다.

    $.getJSON({
         url: "https://myurl.com/api",
         headers: { "Authorization": "Bearer " + user.access_token}
    }).then().always(   function (data, textStatus) {
        $("#txtAPIStatus").html(data.status);
        $("#txtAPIValue").html(data.responseText);
    });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.