$ .ajax'ın başarısı ile .done () yöntemi arasındaki fark nedir


102

Biri bana yardım edebilir mi?
Ben arasındaki farkı anlamak mümkün değilim successve .done()bir $.ajax.

Mümkünse lütfen örnekler verin.


$ .ajax () 'ın done () yöntemini nerede okudunuz? AFAIK yapılan yöntem $ .Deferred nesnesiyle ilgilidir. Belki bunun yerine .complete () 'den bahsediyorsunuz?
Fabrizio Calderan


2
tamam, jQuery 1.8 :) $ .ajax jQuery 1.5'ten bir söz verdiğinden, bu tutarlılık meselesinin basit bir ikamesidir (ertelenmiş arayüzünü kullanarak): done () başarının yerini alır (), hata için başarısız () () ve her zaman () tamamlamak için ()
Fabrizio Calderan

2
Gerçek değişiklik, programlı olarak birden çok geri arama ekleyebilmenizdir. $ .Deferred dokümantasyon sayfasına bakın.
Fabrizio Calderan

Yanıtlar:


8

Kısacası, başarı geri arama işlevini ajax işlevinden ayırarak, daha sonra orijinal kodu (gözlemci kalıbı) değiştirmeden kendi işleyicilerinizi ekleyebilirsiniz.

Lütfen buradan daha ayrıntılı bilgi bulun: https://stackoverflow.com/a/14754681/1049184


1
Ve bunun altındaki örnek, tamamlandı => başarı, başarısız => hata ve her zaman => tamamlandı
StuartLC

25
Bu cevap asıl noktayı kaçırıyor. success: Bir parametre olarak kullanılan ve .success()bir yöntem olarak kullanılan arasında bir fark vardır jqXHR. İkincisi kullanımdan kaldırılıyor, ancak ilki OP'nin sorduğu şey.
Alnitak

2
Başarı / hata / tamamlama kullanımdan kaldırılmıştır ve AJAX durum değişikliklerine dayanır; yapıldı / başarısız / her zaman jQuery Ertelenmiş durum değişikliklerine dayanır. Api.jquery.com/category/deferred-object adresine bakın .
mickeyreiss

28
Soruyu yanlış yorumlayan bir cevabın hem en yüksek oyu alan hem de kabul edilen çözüm olduğuna inanamıyorum ...
Transcendence

108

successyalnızca AJAX çağrısı başarılı olursa tetiklenir, yani sonuçta bir HTTP 200 durumu döndürür. errorBaşarısız olursa ve completeistek tamamlandığında, başarıya bakılmaksızın tetiklenir.

İlgili jQuery 1.8 içinde jqXHRbir nesne ile (geri $.ajax) successile değiştirildi done, errorile failve completeile always.

Ancak yine de AJAX isteğini eski sözdizimi ile başlatabilmeniz gerekir. Yani bunlar benzer şeyler yapar:

// set success action before making the request
$.ajax({
  url: '...',
  success: function(){
    alert('AJAX successful');
  }
});

// set success action just after starting the request
var jqxhr = $.ajax( "..." )
  .done(function() { alert("success"); });

Bu değişiklik, jQuery 1.5'in ertelenmiş nesnesiyle uyumluluk içindir . Ertelenmiş (ve artık PromiseChrome ve FX'te tam yerel tarayıcı desteğine sahip olan), eşzamansız eylemler zincirlemenize olanak tanır:

$.ajax("parent").
    done(function(p) { return $.ajax("child/" + p.id); }).
    done(someOtherDeferredFunction).
    done(function(c) { alert("success: " + c.name); });

Bu işlev zincirinin bakımı, birlikte aldığınız iç içe geçmiş bir geri arama piramidinden daha kolaydır success.

Ancak, bunun yerine kullanılan sözdizimi donelehine artık kullanımdan kaldırıldığını lütfen unutmayın :Promisethen

$.ajax("parent").
    then(function(p) { return $.ajax("child/" + p.id); }).
    then(someOtherDeferredFunction).
    then(function(c) { alert("success: " + c.name); }).
    catch(function(err) { alert("error: " + err.message); });

Bu değer benimseyerek çünkü asyncve awaitsözler geliştirilmiş sözdizimi (ve hata işleme) uzatmak:

try {
    var p = await $.ajax("parent");
    var x = await $.ajax("child/" + p.id);
    var c = await someOtherDeferredFunction(x);
    alert("success: " + c.name);
}
catch(err) { 
    alert("error: " + err.message); 
}

istekte bulunmadan önce işlev oluşturma ve istek yaptıktan sonra işlevi ayarlama. Görünüşe göre ikisi de aynı ... bana başka farklılıklar gösterir misin ???
suhailvs

@suhail - gerçekten hiç yok; jQuery 1.6'da successjQuery 1.8'de yerini done. Aynı şekilde çalışırlar, ancak donejQuery'nin geri kalanıyla daha tutarlıdırlar.
Keith

@Keith, bugün .done kullanmak başarı kullanmakla aynı şey mi? yoksa daha yeni bir şey mi var?
Roxy'Pro

@ Roxy'Pro, bunu yanıtladığımda modası geçmişti, bunu kesinlikle 2018'de kullanmazdım. JQuery'nin ne .doneolduğu konusundaki erken (ve şimdi çıkmaz) bıçağıydı Promiseve şimdi oldukça kapsamlı bir dil desteğine sahip. Yeni projelerde const response = await fetch(...)bunun yerine kullanırdım.
Keith

6

.success() yalnızca web sunucunuz 200 OK HTTP başlığıyla yanıt verirse çağrılır - temelde her şey yolunda olduğunda.

Done () öğesine eklenen geri aramalar, ertelenmiş çözüm çözüldüğünde tetiklenecektir. Fail () 'e eklenen geri aramalar, ertelenen reddedildiğinde tetiklenecektir.

promise.done(doneCallback).fail(failCallback)

.done() has only one callback and it is the success callback

4
Hatalı biçimlendirilmiş JSON bir 200 / OK durum koduyla geri gönderildiğinde .success () işlevinin çağrılmadığını belirtmek gerekir. Spesifik olarak, NaN değerleri üreten ve bunları javascript NaN olarak serileştiren web sunucusu arka uç koduyla ilgili bir sorunla karşılaştım (yani, aslında geçerli olmayan JSON değil, 'NaN' dizisi olarak değil) - bu nedenle yanıtın JSON olarak ayrıştırılması başarısız olur ve .fail () çalıştırılır, ancak yanıt durumu 200'dür. Ancak yine de başarının YALNIZCA bir OK durum koduyla çağrıldığı doğrudur; sadece iyi olduğu için bunun 'başarılı' olduğu anlamına gelmediğini belirtmek istedim;)
Kasapo

1

successistek başarılı olduğunda çağrılan ve $.ajaxaramanın bir parçası olan geri aramadır. doneaslında jqXHRtarafından döndürülen nesnenin bir parçasıdır $.ajax()ve successjQuery 1.8'de yerini alır .

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.