2010-05-14 6 views
144

Ajax isteği başarısız olursa, hatayı yakalamak ve uygun mesajı göstermek istiyorum.Ajax sorgu sonrası hatalarını nasıl yakalarım?

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

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'ta Hata" nın hiçbir zaman yürütülemediğini öğrendim.

Ajax hatasını nasıl ele alırım ve başarısız olursa uygun mesajı nasıl gösteririm?

cevap

175

jQuery 1.5 Eğer ertelenmiş nesneler mekanizmasını kullanabilir beri:

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

diğer bir yolu .ajax kullanıyor: uygulamak için

$.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, ertelenmiş nesneleri kullanarak bir hata geri bildirimini kabul edebilir. Bir örnek için aşağıdaki cevaba bir göz atın. –

+2

Ayrıca, $ .ajax’ı daha okunabilir hale getirmenin yolu, verileriniz için bir karma kullanmanızdır. Örneğin: '{name: 'John', konum: 'Boston'}' – briangonzalez

+3

Yukarıdaki başarı ve hata geri çağrıları jQuery 1.8'den itibaren geçersizdir http://api.jquery.com/jQuery.post/ – Baldy

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

basit bir yolu olduğunu ajaxError:

Ne zaman bir n Ajax isteği bir hatayla 'u tamamlar, jQuery ajaxError olayını tetikler. .ajaxError() yöntemiyle kaydedilmiş olan tüm ve tüm işleyiciler bu kez adresinde gerçekleştirilir. Örneğin

:

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

Ben ajaxError belgeleri okuma öneririz. Yukarıda gösterilen basit kullanım örneği daha yapar - esas olarak geri arama bir dizi parametre 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ç argüman aldığını ekleyebilirim. fiili hatayı, cevap kodunu, url vb. görüntüleyebilirsiniz. –

+0

@Nick - bunu ekledi. – karim79

+0

Mükemmel ... ama benden bir + 2 alamıyorsunuz! :) –

244

JQuery 1.5 güzel bu ele ertelenmiş nesneler ilave edildi. $.post'u arayın ve aramadan sonra istediğiniz herhangi bir işleyiciyi ekleyin. Ertelenmiş nesneler, birden çok başarı ve hata işleyicisi eklemenize bile izin verir.

Örnek: jQuery 1.8

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

önce, işlev donesuccess denilen ve failerror olarak adlandırılmıştır.

+3

+1 Çok güzel, ama sözdizimi hakkında hala deli değil. Umarım gelecekteki bir sürümde birleşir. – Yuck

+19

Bu kabul edilen cevap olmalı. Mevcut kabul edilen cevap “farklı bir yöntem kullan”; Bu cevap, "yönteminizi nasıl çalıştıracağınızı" söylüyor. İkincisi genellikle SO üzerinde tercih edilir. Aslında, bu $ .post belgelerine dahil edilmelidir! –

+2

http://api.jquery.com/deferred.fail, http://api.jquery.com/deferred.done belgeler için – Deleplace

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

Biraz daha fazla açıklama eklemek, gelecekteki okuyuculara yardımcı olacaktır. –

+0

Eğer tanımlanmamış bir hata varsa? – Muflix

1

Bu sorunu jQuery ajax çağrımda datatype: 'json' bildirerek giderdim.