definizione della funzione di callback di successo jQuery ajax


91

Voglio usare jQuery ajax per recuperare i dati da un server.

Voglio mettere la definizione della funzione di callback di successo al di fuori del .ajax()blocco come segue. Quindi devo dichiarare la variabile dataFromServercome la seguente in modo da poter utilizzare i dati restituiti dal callback di successo?

Ho visto molte persone definire il callback di successo all'interno del .ajax()blocco. Quindi il seguente codice è corretto se voglio definire la richiamata di successo all'esterno?

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
}

Risposte:


93

Usa solo:

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

La successproprietà richiede solo un riferimento a una funzione e passa i dati come parametro a questa funzione.

Puoi accedere alla tua handleDatafunzione in questo modo a causa del modo in cui handleDataè dichiarato. JavaScript analizzerà il codice per le dichiarazioni di funzione prima di eseguirlo, quindi sarai in grado di utilizzare la funzione nel codice che precede la dichiarazione effettiva. Questo è noto come sollevamento .

Questo non conta per le funzioni dichiarate in questo modo, però:

var myfunction = function(){}

Questi sono disponibili solo quando l'interprete li ha superati.

Vedere questa domanda per ulteriori informazioni sui 2 modi di dichiarare le funzioni


1
@ Alnitak, quando è stata presentata la deferred objectscosa? Non l'ho mai visto prima. Inoltre, sembra un po 'disordinato, poiché il codice che definisce quale callback usare si trova in una posizione diversa rispetto alla chiamata AJAX effettiva.
Cerbrus

4
è stato introdotto in jQuery 1.5 ed è molto meno complicato rispetto all'utilizzo success:. Disaccoppiare la richiamata dall'AJAX è una buona cosa! Vedi le note che ho appena aggiunto alla fine della mia risposta.
Alnitak

@ Alnitak, darò un'occhiata. Vediamo se riesco a convincermi: P
Cerbrus

@ Alnitak: Gli oggetti differiti sono sempre preferiti rispetto alla richiamata riuscita? Grazie.
tonga

@tonga IMHO, sì, molto preferito. Se il tuo codice fosse stato utilizzato $.get()ad esempio, sarebbe stato impossibile aggiungere un error:gestore perché $.getnon lo supporta. Tuttavia è possibile aggiungere un .failal risultato differito di $.get.
Alnitak

200

Il "nuovo" modo per farlo da jQuery 1.5 (gennaio 2011) consiste nell'usare oggetti differiti invece di passare un successcallback. È necessario restituire il risultato di $.ajaxe quindi utilizzare i metodi .done, .failecc per aggiungere i callback al di fuori della $.ajaxchiamata .

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

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

getData().done(handleData);

Questo separa la gestione del callback dalla gestione AJAX, consente di aggiungere più callback, callback di errore, ecc., Il tutto senza mai dover modificare la getData()funzione originale . Separare la funzionalità AJAX dall'insieme di azioni da completare in seguito è una buona cosa!.

I differiti consentono anche una sincronizzazione molto più semplice di più eventi asincroni, cosa che non puoi fare facilmente con success:

Ad esempio, potrei aggiungere più callback, un gestore degli errori e attendere che trascorra un timer prima di continuare:

// 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
});

Anche altre parti di jQuery usano oggetti differiti: puoi sincronizzare molto facilmente le animazioni di jQuery con altre operazioni asincrone.


1
@Cerbrus guarda il nuovo esempio e poi considera come lo faresti senza oggetti differiti
Alnitak

Gli oggetti posticipati @jbl sono fantastici. Io normalmente downvote qualsiasi risposta che promuove l'uso della success:causa deferreds solo di lavoro molto meglio.
Alnitak

@Cerbrus è esattamente come dovrebbe essere interpretato. Suggerisco di cercare qui user:6782 deferredper molti altri esempi.
Alnitak

Come si può utilizzare questo con un evento di invio del modulo?
haakym

Questo alertperò ... lo userei personalmente console.log(data)o se è un array: console.table(data):)
Armstrongest

16

Non so perché stai definendo il parametro al di fuori dello script. Non è necessario. La funzione di callback verrà chiamata automaticamente con i dati di ritorno come parametro. È molto possibile definire la richiamata al di fuori di sucess:ie

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

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

la funzione handleData verrà chiamata e il parametro le verrà passato dalla funzione ajax.


6

Prova a riscrivere il tuo gestore del successo in:

success : handleData

La proprietà success del metodo ajax richiede solo un riferimento a una funzione.

Nella funzione handleData puoi prendere fino a 3 parametri:

object data
string textStatus
jqXHR jqXHR

5

Vorrei scrivere :

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


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

15
Il tuo codice non viene mai utilizzato effettivamente in dataFromServermodo che la prima riga possa essere rimossa.
Anthony Grist

2

Non è necessario dichiarare la variabile. La funzione di successo Ajax accetta automaticamente fino a 3 parametri:Function( Object data, String textStatus, jqXHR jqXHR )


In qualche modo ho dovuto cercare un po 'per trovare quei parametri predefiniti. Grazie!
paga il

2

dopo poche ore giocarci e quasi diventare noioso. miracolo è venuto da me, funziona.

<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
non è necessario inserire un'altra chiamata di funzione per il successo. puoi dire direttamente che success : callbackjquery attiverà la tua funzione chiamata callbackcon il dataparametro al suo interno.
Olgun Kaya

-1

Nel tuo componente cioè codice JS angolare:

function getData(){
    window.location.href = 'http://localhost:1036/api/Employee/GetExcelData';
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.