2013-02-07 22 views
70

Desidero utilizzare jQuery ajax per recuperare i dati da un server.jQuery ajax successo funzione di callback definizione

Voglio mettere la definizione della funzione di callback di successo al di fuori del blocco .ajax() come segue. Quindi devo dichiarare la variabile dataFromServer come la seguente in modo che sarò in grado di utilizzare i dati restituiti dalla callback riuscita?

Ho visto la maggior parte delle persone definire la callback di successo all'interno del blocco .ajax(). Quindi il seguente codice è corretto se voglio definire la callback di successo al di fuori?

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 
} 

risposta

73

Basta usare:

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

La struttura success richiede solo un riferimento a una funzione, e passa i dati come parametro a questa funzione.

È possibile accedere alla funzione handleData in questo modo a causa del modo in cui è stato dichiarato handleData. JavaScript analizzerà il tuo 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 hoisting.

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

var myfunction = function(){} 

Quelli sono disponibili solo quando l'interprete li passò.

See this question for more information about the 2 ways of declaring functions

+3

passando 'callback Success' è _so_ 2010 ... – Alnitak

+0

@Alnitak, quando ha fatto la cosa' differita objects' avere introdotto? Non l'ho visto prima. Inoltre, sembra leggermente disordinato, dal momento che il codice che definisce quale callback utilizzare è in una posizione diversa rispetto alla chiamata AJAX effettiva. – Cerbrus

+3

è stato introdotto in jQuery 1.5 ed è _far_ meno disordinato di usare 'success:'. Disaccoppiare il callback da AJAX è una cosa buona! Vedi le note che ho appena aggiunto alla fine della mia risposta. – Alnitak

5

provare a riscrivere il vostro gestore di successo a:

success : handleData 

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

Nei tuoi handleData funzione è possibile richiedere fino a 3 parametri:

object data 
string textStatus 
jqXHR jqXHR 
3

avrei scritto:

var dataFromServer; //declare the variable first 

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


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

Il tuo codice non usa mai 'dataFromServer' in modo che la prima riga possa essere rimossa. –

1

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

163

Il "nuovo" modo di farlo a partire da jQuery 1.5 (gennaio 2011) consiste nell'utilizzare gli oggetti posticipati anziché passare una richiamata success. Si dovrebbe tornare il risultato di $.ajax e quindi utilizzare i .done, .fail ecc metodi per aggiungere i callback al di fuori della chiamata $.ajax.

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

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

getData().done(handleData); 

Questo disaccoppia la gestione della movimentazione AJAX callback, permette di aggiungere più callback, callback fallimento, ecc, il tutto senza mai dover modificare la funzione originale getData().Separare la funzionalità AJAX dal set di azioni da completare successivamente è una buona cosa!.

Deferreds anche consentire molto più facile la sincronizzazione di più eventi asincroni, che non si può facilmente fare proprio con success:

Per esempio, potrei aggiungere più funzioni di callback, un gestore di errori, e attendere un timer che trascorra 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 
}); 

altre parti del jQuery utilizzano oggetti anticipate troppo - è possibile sincronizzare le animazioni jQuery con altre operazioni asincrone molto facilmente con loro.

+1

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

+0

Gli oggetti rinviati @jbl sono fantastici. Io minimamente inversione qualsiasi risposta che promuova l'uso del 'successo:' perché i differimenti funzionano semplicemente molto meglio. – Alnitak

+0

@Cerbrus è esattamente come dovrebbe essere interpretato. Suggerisco di cercare qui per 'utente: 6782 differito' per _lots_ altri esempi. – Alnitak

11

Non so perché si sta definendo il parametro al di fuori dello script. Questo non è necessario. La funzione di richiamata verrà richiamata automaticamente con i dati di ritorno come parametro. E 'molto possibile definire il callback fuori del sucess: cioè

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

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

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

1

dopo poche ore giocare con esso e quasi diventare noioso. il 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> 
+0

non è necessario effettuare un'altra chiamata di funzione per il successo . puoi dire direttamente 'success: callback' jquery attiverà la tua funzione chiamata' callback' con il parametro 'data' in essa. –

Problemi correlati