GetJSON çağrılarında hata işleme


192

Bir getJSON çağrısında hataları nasıl halledebilirsiniz? Im jsonp kullanarak bir etki alanları arası komut dosyası hizmeti başvurmak çalışıyorum, nasıl bir hata yöntemi kayıt?



Ajay, neden doğru cevabı işaretlemeyi düşünmüyorsun?
Ionică Bizău

@ IonicăBizău Şimdi işaretledi. Bunu bir süreliğine kaybettim. En iyi cevap JSONP hakkında konuşmak değildir. Ben Shelock tarafından işaret edildiği gibi, hiçbir desteklenen hata işleyicisi inanıyorum ne olduğunu ..
Ajay

Yanıtlar:


277

$.getJSON() JSON kodlu bir yanıt istediğinizi söylemek zorunda kalacağınız normal bir AJAX çağrısının bir tür soyutlamasıdır.

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

Hataları iki şekilde ele alabilirsiniz: genel olarak (AJAX çağrılarınızı gerçekte aramadan önce yapılandırarak) veya özel olarak (yöntem zinciri ile).

'jenerik' şuna benzer:

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

Ve 'özel' yol:

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

Nops! Oraya istediğiniz gibi gidebilirsiniz. Daha ayrıntılı yardım için dokümanlara göz atın: http://api.jquery.com/jQuery.ajax
Luciano Costa

5
Bunun jQuery 1.5+ (jQuery 1.3 ile çalışmasını sağlamaya çalıştığını ve neden geçersiz yöntem hakkında şikayet ettiğini merak ettiğini unutmayın) :-)
kenyee

24
OP özellikle çapraz site hakkında soruyor JSONPgibi görünüyor getJSONbu durumda error()fonksiyonu çağırmaz . Bendede aynı sorun var. Her ikisini de ele almasına rağmen JSONPnormal AJAXaramalardan nasıl tamamen farklı olduğu ile ilgilidir . bir nesneyle yapılır, ancak sayfanın dinamik olarak bir etiket eklenmesi ile yapılır . jQuerygetJSONJSONXMLHTTPRequestJSONP<script>HEAD
hippietrail

3
JQuery Doc "Not: Bu işleyici, etki alanları arası komut dosyası ve JSONP istekleri için çağrılmaz." api.jquery.com/jQuery.ajax > hata
OneWorld

10
JQuery 1.5 sürümünde sunulan jqXHR.success (), jqXHR.error () ve jqXHR.complete () geri arama yöntemleri jQuery 1.8'den itibaren kullanımdan kaldırılmıştır. Kodunuzu nihai olarak kaldırılmak üzere hazırlamak için jqXHR.done (), jqXHR kullanın .fail () ve jqXHR.always () yerine ".
Skorunka František

86

Birisi Luciano'ya bu puanları verdi :) Benzer bir sorusu olan cevabını test ettim ve mükemmel çalıştı ...

50 sentimi bile ekliyorum:

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

3
Bu siteler arası JSONP veya aynı site JSON ile mi?
hippietrail

28
Güzel cevap! .Error hakkında sadece bir not: jQuery 1.8'de kullanımdan kaldırılacak, bu nedenle .fail
Anatoly Mironov

73

İşte ekim.

Gönderen http://www.learnjavascript.co.uk/jq/reference/ajax/getjson.html ve resmi kaynak

" JQuery 1.5 tanıtılan jqXHR.success (), jqXHR.error () ve jqXHR.complete () geri çağırma yöntemleri jQuery 1.8 olarak önerilmemektedir. Onların nihai kaldırılması için kodunuzu hazırlamak için, kullanım jqXHR.done (), jqXHR .fail () ve jqXHR.always () yerine ".

Bunu yaptım ve işte Luciano'nun güncellenmiş kod snippet'i:

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

Hata açıklaması artı tüm json verilerini dize olarak gösteren:

$.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!'); });

Uyarıları beğenmediyseniz, bunların yerine 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!'); });

yapılan, başarısız, her zaman ve getJSON içindeki kodun kronolojik sırası nedir?
TheLogicGuy

not: console.log eski tarayıcılarda IE7 olarak uygulanmaz! Kullanmanız durumunda!
MadMad666

12

Birinin burada cevap vermesinden bu yana bir süre geçtiğini biliyorum ve poster muhtemelen cevabını buradan veya başka bir yerden almıştı. Ancak bu yazı getJSON istekleri yaparken hataları ve zaman aşımlarını takip etmek için bir yol arayan herkese yardımcı olacağını düşünüyorum. Bu nedenle aşağıdaki soruya verdiğim cevap

GetJSON yapısı aşağıdaki gibidir ( http://api.jqueri.com adresinde bulunur ):

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

çoğu insan bunu kullanarak

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

url var'ı JSON verilerine bir bağlantı sağlamak için kullandıkları yerde "?callback=?", doğru JSON verisini almak için gönderilmesi gereken diğer değişkenleri ve gönderilmesi gereken diğer değişkenleri ve verilerin işlenmesi için bir işlev olarak başarı işlevini kullanır. .

Ancak, status ve xhr değişkenlerini başarı fonksiyonunuza ekleyebilirsiniz. Durum değişkeni şu dizelerden birini içerir: "başarılı", "değiştirilmemiş", "hata", "zaman aşımı" veya "ayrıştırıcı" ve xhr değişkeni döndürülen XMLHttpRequest nesnesini (w3schools'ta bulunur ) içerir

$.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");
    }         
});

Bu şekilde, bir istek yapıldığında başlatılan özel bir zaman aşımı izleyicisi uygulamak zorunda kalmadan zaman aşımlarını ve hataları takip etmek kolaydır.

Umarım bu hala bu soruya cevap arayan birine yardımcı olur.


2
Bu işe yaramıyor. "Başarı" geri aramasına, adından da anlaşılacağı gibi, yalnızca başarı denir. (Yani "status" parametresinin ne için olduğundan emin değilim ...)
jwelsh

4

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

JQuery 2.x ile sabitlenmiştir; JQuery 1.x sürümünde hiçbir zaman hata geri çağrısı almazsınız


1

Aynı sorunla karşı karşıya kaldım, ancak başarısız bir istek için geri arama oluşturmak yerine, sadece json veri nesnesiyle ilgili bir hata döndürdüm.

Mümkünse, bu en kolay çözüm gibi görünüyor. İşte kullandığım Python kodunun bir örneği. (Flask, Flask'ın jsonify f ve SQLAlchemy kullanarak)

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.")

Sonra böyle Javascript kontrol edebilirsiniz;

$.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
    }
});

Bu, sunucu içinde oluşan hatalar için iyidir, ancak çağrı sunucuya ulaşamadığında veya bir MVC kullanıcısı artık doğrulanmamış gibi sunucu koduna ulaşmadan önce bir hata oluşursa yakalanmaz.
Lee Oades

1

Neden olmasın

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.');
        })
}

??

Kullanılan .fail()yöntemle ilgili ayrıntılar için (jQuery 1.5+), bkz. Http://api.jquery.com/jQuery.ajax/#jqXHR

Yana jqXHRfonksiyonu, bir zincirleme gibi tarafından döndürülen

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

mümkün.


0

Bazı durumlarda, bu yöntemle senkronizasyon sorunu yaşayabilirsiniz. Geri arama çağrısını birsetTimeout fonksiyonun senkronize olarak gayet iyi çalıştı =)

ÖRNEĞİN:

function obterJson(callback) {


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

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

0

Bu oldukça eski bir iş parçacığı, ama Google arama geliyor, bu yüzden vaat kullanarak bir jQuery 3 cevap eklemek düşündüm. Bu pasaj ayrıca şunları gösterir:

  • Taşıyıcı simgenizi geçmek için artık $ .ajax'a geçmenize gerek yok
  • Herhangi bir sonucu eşzamanlı olarak işleyebildiğinizden emin olmak için .then () kullanır ( bu sorunla karşılaşıyordum .always () geri arama çok erken -% 100 doğru olduğundan emin değilim)
  • Yalnızca olumlu ya da olumsuz sonucu göstermek için .always () kullanıyorum
  • .Always () işlevinde HTTP Durumu kodu ve ileti gövdesi ile iki hedefi güncelliyorum

Kod pasajı:

    $.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);
    });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.