Ajax sorgu sonrası hatasını nasıl yakalarım?


209

Ajax isteği başarısız olursa hatayı yakalamak ve uygun mesajı göstermek istiyorum.

Kodum aşağıdaki gibidir, ancak başarısız Ajax isteğini yakalayamadı.

function getAjaxData(id)
{
     $.post("status.ajax.php", {deviceId : id}, function(data){

        var tab1;

        if (data.length>0) {
            tab1 = data;
        }
        else {
            tab1 = "Error in Ajax";
        }

        return tab1;
    });
}

Ajax isteği başarısız olduğunda "Ajax hata" asla yürütülmediğini öğrendim.

Ajax hatasını nasıl işleyebilir ve başarısız olursa uygun mesajı nasıl gösterebilirim?

Yanıtlar:


304

JQuery 1.5'den beri ertelenmiş nesneler mekanizmasını kullanabilirsiniz:

$.post('some.php', {name: 'John'})
    .done(function(msg){  })
    .fail(function(xhr, status, error) {
        // error handling
    });

Başka bir yol kullanmak .ajax:

$.ajax({
  type: "POST",
  url: "some.php",
  data: "name=John&location=Boston",
  success: function(msg){
        alert( "Data Saved: " + msg );
  },
  error: function(XMLHttpRequest, textStatus, errorThrown) {
     alert("some error");
  }
});

14
@Yuck $ .post, ertelenen nesneleri kullanarak bir hata geri aramasını kabul edebilir. Örnek için aşağıdaki cevabıma bir göz atın.
Michael Venable

2
Ayrıca, $.ajaxdaha okunabilir hale getirmenin yolu sizin için bir karma kullanmaktır data. Örneğin:{ name : 'John', location: 'Boston' }
briangonzalez

3
Yukarıdaki başarı ve hata geri çağrıları, jQuery 1.8 api.jquery.com/jQuery.post
Baldy

@MichaelVeneble kullanabileceğinizi düşünüyorum$.post().error()
clintgh

288

jQuery 1.5 bunu güzel işleyen ertelenmiş nesneler ekledi. Aramadan $.postsonra istediğiniz işleyicileri arayın ve ekleyin. Ertelenmiş nesneler birden fazla başarı ve hata işleyici eklemenize bile izin verir.

Misal:

$.post('status.ajax.php', {deviceId: id})
    .done( function(msg) { ... } )
    .fail( function(xhr, textStatus, errorThrown) {
        alert(xhr.responseText);
    });

JQuery 1.8'den önce fonksiyon doneçağrıldı successve failçağrıldı error.


3
+1 Çok güzel, ama sözdizimi konusunda hala çılgınca değil. Umarım gelecekteki bir sürümde birleşir.
Yuck

25
Bu kabul edilen cevap olmalı. Şu an kabul edilen cevap "farklı bir yöntem kullan"; bu cevap "yönteminizi nasıl çalıştıracağınızı burada anlatır" der. İkincisi genellikle SO'da tercih edilir. Aslında, bu $ .post belgelerine dahil edilmelidir !!!
Mark E. Haase


Bu arada responseJSONajax türü durumunda da çok kullanışlı olan bir özellik de var json.
ivkremer

91
$.ajax({
  type: 'POST',
  url: 'status.ajax.php',
  data: {
     deviceId: id
  },
  success: function(data){
     // your code from above
  },
  error: function(xhr, textStatus, error){
      console.log(xhr.statusText);
      console.log(textStatus);
      console.log(error);
  }
});

15
$.post('someUri', { }, 
  function(data){ doSomeStuff })
 .fail(function(error) { alert(error.responseJSON) });

5
Buraya biraz daha açıklama eklemek gelecekteki okuyuculara yardımcı olacaktır.
Eric Brown

13

Basit bir yol ajaxError uygulamaktır :

Bir Ajax isteği bir hatayla tamamlandığında, jQuery ajaxError olayını tetikler. .AjaxError () yöntemiyle kaydedilmiş tüm ve işleyiciler şu anda yürütülür.

Örneğin:

$('.log').ajaxError(function() {
  $(this).text('Triggered ajaxError handler.');
});

AjaxError belgelerini okumanızı öneririm . Yukarıda gösterilen basit kullanım durumundan daha fazlasını yapar - esas olarak geri çağrısı bir dizi parametreyi kabul eder:

$('.log').ajaxError(function(e, xhr, settings, exception) {
  if (settings.url == 'ajax/missing.html') {
    $(this).text('Triggered ajaxError handler.');
  }
});

1
+1 - Bu işleyicinin birkaç bağımsız değişken aldığını eklerim, böylece gerçek hatayı, yanıt kodunu, url'yi vb. Görüntüleyebilirsiniz
Nick Craver

JQuery 1.8 itibariyle .ajaxError () yönteminin yalnızca belgeye eklenmesi gerektiğini unutmayın.
Nanki

0

Cevabı günlüğe kaydetmelisiniz

$.ajax({
    type: 'POST',
    url: 'status.ajax.php',
    data: {
    deviceId: id
  }
})
.done(
 function (data) {
  //your code
 }
)
.fail(function (data) {
      console.log( "Ajax failed: " + data['responseText'] );
})

0

.onerror işleyicisini ajax nesnesine bağlarsınız, insanlar neden vanila çapraz platformda çalışırken yanıtlar için JQuery yayınlamakta ısrar ediyorlar ...

quickie örneği:

ajax = new XMLHttpRequest();
ajax.open( "POST", "/url/to/handler.php", true );
ajax.onerror = function(){
    alert("Oops! Something went wrong...");
}
ajax.send(someWebFormToken );
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.