jQuery ajax hata işlevi


130

Daha sonra bir değer döndüren bir sayfaya veri aktaran bir ajax çağrım var.

Sayfadan başarılı aramayı aldım, ancak asp'de bir hata oluşturacak şekilde kodladım. Bu hatayı jquery'den nasıl alırım?

Örneğin:

cache: false,
url: "addInterview_Code.asp",
type: "POST",
datatype: "text",
data: strData,
success: function (html) {
    alert('successful : ' + html);
    $("#result").html("Successful");
},
error: function (error) {
    **alert('error; ' + eval(error));**
}

Anlamadığım hata biti. Sonra ben bu hata mesajını kullanabilir böylece, ben koymak gerekmez ne parametre fonksiyonunda kaldırdı sunucusunda.


Orada bir yazım hatası var: dataTypedeğil datatype.
Alejandro Nava


7
@ alej27: ifadeler biraz tuhaf, ancak ikisini birden kullanamayacağınızı söylemiyor, bir isteğin başarı ve hata olarak adlandırılmayacağını söylüyor (çünkü bunlar birbirini dışlıyor).
Marty Vance

Burada yanıtlara dikkat edin jQuery 3.0'dan itibaren, kullanımdan kaldırılanlar not edildi .errorve kaldırıldıkça .successdaha önemli hale geliyor.
Mark Schultheiss

Yanıtlar:


222

Bir Ajax errorişlevinde gerekli parametreler şunlardır jqXHR, exceptionve aşağıdaki gibi kullanabilirsiniz:

$.ajax({
    url: 'some_unknown_page.html',
    success: function (response) {
        $('#post').html(response.responseText);
    },
    error: function (jqXHR, exception) {
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    },
});

DEMO FIDDLE


Parametreler

jqXHR:

Aslında şuna benzeyen bir hata nesnesi

Ajax hatası jqXHR nesnesi

Bunu, aşağıdaki gibi işlevin console.logiçinde kullanarak kendi tarayıcı konsolunuzda da görüntüleyebilirsiniz error:

error: function (jqXHR, exception) {
    console.log(jqXHR);
    // Your error handling logic here..
}

statusHata kodunu almak için bu nesnenin özelliğini kullanıyoruz , örneğin status = 404 alırsak bu istenen sayfanın bulunamadığı anlamına gelir. Hiç yok. Bu durum koduna bağlı olarak, kullanıcıları giriş sayfasına veya iş mantığımızın gerektirdiği her şeye yönlendirebiliriz.

istisna:

Bu, istisna türünü gösteren dize değişkenidir. Dolayısıyla, 404 hatası alıyorsak, exceptionmetin basitçe 'hata' olacaktır. Benzer şekilde, diğer istisna metinleri olarak 'zaman aşımı', 'iptal' alabiliriz.


Eskime Uyarı:jqXHR.success() , jqXHR.error()ve jqXHR.complete()geri çağrıları jQuery 1.8 olarak önerilmemektedir. Onların nihai kaldırılması için kodunuzu hazırlamak için, kullanmak jqXHR.done(), jqXHR.fail()ve jqXHR.always()bunun yerine.

Bu nedenle, jQuery 1.8 veya üstünü kullanıyorsanız , aşağıdaki gibi başarı ve hata işlevi mantığını güncellememiz gerekecektir: -

// Assign handlers immediately after making the request,
// and remember the jqXHR object for this request
var jqxhr = $.ajax("some_unknown_page.html")
    .done(function (response) {
        // success logic here
        $('#post').html(response.responseText);
    })
    .fail(function (jqXHR, exception) {
        // Our error logic here
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    })
    .always(function () {
        alert("complete");
    });

Umarım yardımcı olur!


6
İlginç bir şekilde ajaxSetup kullanılması önerilmez. Bkz api.jquery.com/jquery.ajaxsetup
SleepyBoBos

1
@ palaѕн Ben kullanımdan kaldırma bildirimini yanlış okuduğunuzu düşünüyorum. Fark ederseniz, kullanımdan kaldırma bildirimi jqXHR yöntemlerinin kullanımdan kaldırılmasından bahsediyor, ancak yukarıdaki örneğinizde başarı, hata ve tam kullanımları $ .ajax yöntemine bir nesne içinde yapılır. Bu kullanımdan kaldırılmadı ve kodunuzu değiştirmeniz gerekmiyor. Bununla birlikte, eğer biri yöntemleri zincirlemeyi tercih ederse, o zaman bu stili kullanabilirsiniz. "Kullanımdan kaldırmayı ..." okuduğumda bu beni (sebepsiz yere) attı. :-)
bchr02

JQuery 3.0'dan itibaren kullanımdan kaldırılanlar not edildi .errorve kaldırıldıkça .successdaha önemli hale geldi
Mark Schultheiss

99

Bunu dene:

error: function(jqXHR, textStatus, errorThrown) {
  console.log(textStatus, errorThrown);
}

Ön ucunuza bir doğrulama hatası hakkında bilgi vermek istiyorsanız, json döndürmeyi deneyin:

dataType: 'json',
success: function(data, textStatus, jqXHR) {
   console.log(data.error);
}

Asp betiğiniz şunu döndürmelidir:

{"error": true}

1
TextSttaus ve errorThrown nedir? Lütfen açıklar mısınız
Annapurna

4

İşte asp hatasını nasıl çıkaracağınız.

              cache: false,
              url: "addInterview_Code.asp",
              type: "POST",
              datatype: "text",
              data: strData,
              success: function (html) {
                  alert('successful : ' + html);
                  $("#result").html("Successful");
              },
              error: function (jqXHR, textStatus, errorThrown) {
                  if (jqXHR.status == 500) {
                      alert('Internal error: ' + jqXHR.responseText);
                  } else {
                      alert('Unexpected error.');
                  }
              }

2
error(jqXHR, textStatus, errorThrown)

http://api.jquery.com/jQuery.ajax/


9
Lütfen sadece bir kod parçası ve dokümanlar için bir bağlantı değil, biraz açıklama sağlayın.
Greg Dubicki

12
Neredeyse hiçbir şey için teşekkür ederim.
judasane

örneğin, "OP bir işlev hatası kullanıyor (hata) ama jquery bir işlev hatası çağırıyor (jqXHR, textStatus, errorThrown). OP'nin snippet'indeki 2 eksik parametreye dikkat edin" diyebilirsiniz.
inanılmaz

2
          cache: false,
          url: "addInterview_Code.asp",
          type: "POST",
          datatype: "text",
          data: strData,
          success: function (html) {
              alert('successful : ' + html);
              $("#result").html("Successful");
          },
          error: function(data, errorThrown)
          {
              alert('request failed :'+errorThrown);
          }

2

bir işlev kullanıyorsun

error(error) 

ancak jquery aslında üç parametresi olan bir işlev arıyor:

error(jqXHR, textStatus, errorThrown)

iki parametre daha eklemeniz gerekecek.

AYRICA: Lütfen yukarıdaki 'kullanımdan kaldırıldı' ifadesinin yer aldığı tüm yorumlara bir göz atın :)

$.ajax("www.stackoverflow.com/api/whatever", {
    dataType:"JSON"
    data: { id=1, name='example' }
}).succes(function (result) {
    // use result
}).error(function (jqXHR, textStatus, errorThrown) {
    // handle error
});

4
iki parametre daha eklemeniz gerekecek - bu çok yanlış.
Geliştirici

1
hı. Tüm söyleyeceğin buysa - belki hiçbir şey söylemeyebilir misin? ya da ifadenizi açıklayabilir ve gerçekten yardımcı olabilirsiniz. Senin seçimin.
Incredibelly

1
JavaScript'te, bir yönteminiz olduğunu söyleyin - function myMethod (err) { alert(err); }ve sonra onu şöyle çağırın myMethod ("something is wrong", 500, some_object)- Bu herhangi bir sorun olmadan çalışacaktır. İfadenize göre, bu yalnızca yöntem imzası ise işe yarar function myMethod (err, status, some_object). Yukarıdaki örneği unutun success, cevapta sahip olduğunuz olayın imzası aslında .success(data, status, xhr)ama sadece sonuca ihtiyacınız varsa, genellikle onu gibi bağlarız .success (data)ve her ikisi de çalışır.
Geliştirici

Ve bu yanıtı ekleyerek ne gibi bir değer kattınız? IMO Cevabınızda önceki cevaplarda eksik olan herhangi bir bilgi yok. Yaptığın tek şey bu soruyu tekrar yığmaktı.
Geliştirici

0

Jquery.com adresinden:

The jqXHR.success(), jqXHR.error(), and jqXHR.complete()
callback methods introduced injQuery 1.5 are deprecated
as of jQuery 1.8. To prepare your code for their eventual 
removal, use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead.

Global işleyiciler istiyorsanız şunları kullanabilirsiniz:

.ajaxStart(), .ajaxStop(),
.ajaxComplete(), .ajaxError(),
.ajaxSuccess(), .ajaxSend()
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.