jQuery ajax başarı geri arama işlevi tanımı


91

Bir sunucudan veri almak için jQuery ajax kullanmak istiyorum.

Başarı geri arama işlevi tanımını .ajax()aşağıdaki gibi bloğun dışına koymak istiyorum . dataFromServerBaşarı geri aramasından dönen verileri kullanabilmem için değişkeni aşağıdaki gibi bildirmem gerekiyor mu?

Çoğu insanın .ajax()bloğun içinde başarı geri aramasını tanımladığını gördüm . Başarı geri aramasını dışında tanımlamak istersem aşağıdaki kod doğru mu?

var dataFromServer;  //declare the variable first

function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData(dataFromServer)
    })
}

function handleData(data) {
    alert(data);
    //do some stuff
}

Yanıtlar:


93

Sadece kullan:

function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData
    })
}

successÖzelliği bir fonksiyona sadece bir referans gerektirir ve bu işlev için parametre olarak veri geçer.

Bu handleDataşekilde handleDatailan edilme şekli nedeniyle fonksiyonunuza bu şekilde erişebilirsiniz . JavaScript, kodunuzu çalıştırmadan önce işlev bildirimleri için ayrıştırır, böylece işlevi gerçek bildirimden önceki kodda kullanabilirsiniz. Bu, kaldırma olarak bilinir .

Yine de, bu şekilde bildirilen işlevler sayılmaz:

var myfunction = function(){}

Bunlar yalnızca tercüman geçtiğinde kullanılabilir.

Fonksiyonları bildirmenin 2 yolu hakkında daha fazla bilgi için bu soruya bakın


1
@Alnitak, bu deferred objectsşey ne zaman tanıtıldı? Daha önce görmedim. Ayrıca, hangi geri aramanın kullanılacağını tanımlayan kod gerçek AJAX çağrısından farklı bir konumda olduğundan biraz dağınık görünüyor.
Cerbrus

4
jQuery 1.5 ile tanıtıldı ve kullanmaktan çok daha az dağınık success:. Geri aramayı AJAX'tan ayırmak iyi bir şey! Cevabımın sonuna eklediğim notlara bakın.
Alnitak

@Alnitak, bir bakayım. Bakalım ikna olup olamayacağım: P
Cerbrus

@Alnitak: Ertelenmiş nesneler her zaman başarı geri aramasına tercih edilir mi? Teşekkürler.
tonga

@tonga IMHO, evet, çok tercih edildi. Örneğin kodunuz kullanılıyor $.get()olsaydı, desteklemediği için bir error:işleyici eklemek imkansız olurdu $.get. Ancak yapabilirsiniz bir ekleme .failertelenen için sonuç arasında $.get.
Alnitak

200

JQuery 1.5'ten (Ocak 2011) bu yana bunu yapmanın "yeni" yolu, successgeri aramayı iletmek yerine ertelenmiş nesneleri kullanmaktır . Sen gerektiğini dönmek sonucunu $.ajaxve sonra kullanmak .done, .failgeri aramalar eklemek vb yöntemler dışında $.ajaxçağrı .

function getData() {
    return $.ajax({
        url : 'example.com',
        type: 'GET'
    });
}

function handleData(data /* , textStatus, jqXHR */ ) {
    alert(data);
    //do some stuff
}

getData().done(handleData);

Bu , geri arama işlemini AJAX işleminden ayırır , orijinal getData()işlevi değiştirmeye gerek kalmadan birden çok geri arama, hata geri arama vb. Eklemenize izin verir . AJAX işlevselliğini daha sonra tamamlanacak eylemler dizisinden ayırmak iyi bir şeydir!.

Ertelenenler, aynı zamanda birden fazla eşzamansız olayın çok daha kolay senkronizasyonuna da izin verir; success:

Örneğin, birden çok geri arama, bir hata işleyici ekleyebilir ve devam etmeden önce bir zamanlayıcının geçmesini bekleyebilirim:

// a trivial timer, just for demo purposes -
// it resolves itself after 5 seconds
var timer = $.Deferred();
setTimeout(timer.resolve, 5000);

// add a done handler _and_ an `error:` handler, even though `getData`
// didn't directly expose that functionality
var ajax = getData().done(handleData).fail(error);

$.when(timer, ajax).done(function() {
    // this won't be called until *both* the AJAX and the 5s timer have finished
});

ajax.done(function(data) {
    // you can add additional callbacks too, even if the AJAX call
    // already finished
});

JQuery'nin diğer bölümleri de ertelenmiş nesneleri kullanır - jQuery animasyonlarını diğer eşzamansız işlemlerle çok kolay bir şekilde onlarla senkronize edebilirsiniz.


1
@Cerbrus yeni örneğe bakın ve ertelenmiş nesneler olmadan bunu nasıl yapacağınızı düşünün
Alnitak

@jbl ertelenmiş nesneler harika. Ben normalde kullanımını teşvik herhangi bir cevap downvote success:deferreds sadece çok daha iyi bu yüzden çalıştıkları için.
Alnitak

@Cerbrus, tam olarak nasıl yorumlanması gerekiyor. Eğer burada aramak öner user:6782 deferrediçin çok fazla örnek.
Alnitak

Bunu bir form gönderme olayı ile nasıl kullanabiliriz?
haakym

Yine alertde ... Şahsen kullanırdım console.log(data)ya da bir dizi ise: console.table(data):)
Armstrongest

16

Parametreyi neden komut dosyasının dışında tanımladığınızı bilmiyorum. Bu gereksizdir. Geri arama fonksiyonunuz, geri dönüş verileriyle birlikte otomatik olarak bir parametre olarak çağrılacaktır. Geri aramanızı sucess:ie dışında tanımlamak çok mümkündür.

function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData
    })
}

function handleData(data) {
    alert(data);
    //do some stuff
}

handleData işlevi çağrılır ve parametre ona ajax işlevi tarafından iletilir.


6

Başarı işleyicinizi şuraya yeniden yazmayı deneyin:

success : handleData

Ajax yönteminin success özelliği yalnızca bir işleve başvuru gerektirir.

HandleData işlevinizde en fazla 3 parametre alabilirsiniz:

object data
string textStatus
jqXHR jqXHR

5

Yazardım :

var handleData = function (data) {
    alert(data);
    //do some stuff
}


function getData() {
    $.ajax({
        url : 'example.com',
        type: 'GET',
        success : handleData
    })
}

15
Kodunuz aslında hiçbir zaman kullanmaz, dataFromServerböylece ilk satır kaldırılabilir.
Anthony Grist

2

Değişkeni bildirmenize gerek yoktur. Ajax başarı işlevi otomatik olarak 3 parametreye kadar alır:Function( Object data, String textStatus, jqXHR jqXHR )


Bir şekilde bu varsayılan parametreleri bulmak için bir süre aramak zorunda kaldı. Teşekkürler!
payne

2

Birkaç saat sonra onunla oynar ve neredeyse donuklaşır. mucize bana geldi, işe yaradı.

<pre>


var listname = [];   


 $.ajax({
    url : wedding, // change to your local url, this not work with absolute url
    success: function (data) {
       callback(data);
    }
});

function callback(data) {
      $(data).find("a").attr("href", function (i, val) {
            if( val.match(/\.(jpe?g|png|gif)$/) ) { 
             //   $('#displayImage1').append( "<img src='" + wedding + val +"'>" );
                 listname.push(val);
            } 
        });
}

function myfunction() {

alert (listname);

}

</pre>

1
Başarı için başka bir işlev çağrısı yapmanıza gerek yoktur. doğrudan success : callbackjquery'nin çağrılan işlevinizi callbackiçindeki dataparametre ile tetikleyeceğini söyleyebilirsiniz .
Olgun Kaya

-1

Bileşeninizde, yani açısal JS kodunuzda:

function getData(){
    window.location.href = 'http://localhost:1036/api/Employee/GetExcelData';
}
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.