2010-08-19 16 views
9

È solo una funzione che viene eseguita dopo un'altra funzione che la chiama, termina?approccio newbie: che cos'è una funzione di callback javascript?

Per favore, so (quasi) nulla sulla programmazione, e trovo molto difficile trovare una risposta o una spiegazione per principianti corretta su cosa significa questo.

Posso richiedere una prova dai guru di stackoverflow?

+1

Date un'occhiata a questa risposta: http://stackoverflow.com/questions/2070275/javascript-closures-and-callbacks/2070389#2070389 –

+0

bel link Thanks a lot. – MEM

risposta

12

In generale, una funzione di richiamata viene utilizzata una volta terminata un'altra funzione chiamata (proprio come indicato nella domanda). Un buon esempio di ciò sono le richieste AJAX: la maggior parte delle librerie ha una funzione che consente di inviare una richiesta al server in background senza aggiornare la pagina (questo utilizza AJAX). In genere si forniscono due funzioni di callback a questa funzione AJAX: una funzione di successo e una funzione di errore.

Se questa richiesta ha esito positivo, chiama la funzione di successo in modo che il codice possa fare ciò di cui ha bisogno; ad esempio, potrebbe aggiornare parte della pagina, fare una sorta di animazione o avvisare l'utente che le sue informazioni sono state salvate. D'altra parte, se fallisce, la funzione di callback probabilmente avviserà l'utente che i suoi dati non sono stati salvati e che dovrebbero riprovare.

Le funzioni di richiamata consentono agli sviluppatori di librerie di creare codice molto generico che altri possono utilizzare e quindi personalizzare in base alle proprie esigenze.

Di seguito è riportato un codice jQuery visualizzare l'esempio di cui sopra (questo codice non funzionerà come l'URL non esiste):

jQuery.ajax(
    url: '/mywebsite/somepage.php', 

    success: function itWorked(returnedData) { 
    // This is the success function and will be called only if the ajax call 
    // completes succesfully 

    alert('Yay it worked! ' + returnedData); 
    }, 

    error: function itFailed(originalRequest, textStatus, errorThrown) { 
    // This is the error function and will only be called if the ajax call 
    // has an error 

    alert('It failed! ' + textStatus + '. ' + errorThrown); 
    } 
); 

EDIT: All'inizio, ho detto, " In generale...". In realtà, i callback vengono utilizzati per molto più che quando termina una funzione. Come dichiarato in altre risposte, può essere utilizzato ovunque all'interno di una funzione: inizio, metà, fine. L'idea di base è che lo sviluppatore del codice potrebbe non sapere come userete il codice HIS. Quindi, lo rende molto generico e ti dà la possibilità di fare tutto ciò che ti serve con i dati.

Un buon esempio di questo è il metodo jQuery.each che permette di passare in un callback che verrà eseguito su ciascuno degli elementi della "matrice" (dico array che può effettivamente iterare su molte cose che può o potrebbero non essere array effettivi).

<a href='someurl.html' class='special_link'>Some URL</a> 
<a href='anotherurl.html' class='special_link'>Another URL</a> 
<a href='onelasturl.html' class='special_link'>One Last URL</a> 

// The following code says: execute the myEachCallbackFunction on every link 
// that has a class of 'special_link' 
$('a.special_link').each(function myEachCallbackFunction(i) { 

    // The link variable will contain the object that is currently 
    // being iterated over. So, the first time through, it will hold 
    // the 'someurl.html' link, the second time it will hold the 
    // 'anotherurl.html' link, and the last time it will hold the 
    // 'onelasturl.html' link 
    var link = $(this); 

    // Change the background color of each link to be red 
    link.css('background-color', 'red'); 
}); 

Quindi, possiamo vedere da questo esempio che gli sviluppatori di jQuery implementato il metodo di .each e ci permettono di fare tutto ciò che vogliamo per ogni link che è chiamata.

1

Una funzione di richiamata è una funzione che viene chiamata automaticamente quando termina un altro processo. Sono molto utili in processi asincroni, come ottenere una pagina.


EDIT

Esempio: Si desidera ottenere effettuare una chiamata ajax (ottenere una pagina, ad esempio). E si desidera eseguire alcune funzioni quando termina il download del.

con jQuery, è possibile utilizzare questo:

$.get('PageIWant.html', myCallBack); 

function myCallBack (data){ 
    alert('I have got the page!'); 
} 
3

Una callback è semplicemente una funzione si specifica che si chiama non subito, ma di solito dopo qualche evento. Questo potrebbe essere qualcosa di simile a una richiesta Ajax, è necessario specificare una richiamata che viene invocata solo quando la richiesta Ajax viene completata correttamente e non si verifica un errore. Un altro esempio potrebbe essere un callback per quando il DOM in una pagina Web è pronto o la finestra viene caricata.

2

Immagina di avere qualche pezzo di codice complesso e proprio nel mezzo di esso, devi fare "qualcosa". Il problema: non hai idea di cosa possa essere "qualcosa" dato che dipende da come viene usato il codice. Richiamata per il salvataggio.

Invece di avere il codice, basta mettere una richiamata lì. L'utente può fornire il proprio codice e verrà eseguito al momento giusto per fare qualcosa di critico. Esempio: jQuery.filter(callback).

jQuery (che si dovrebbe dare un'occhiata) chiamerà callback per ogni elemento in un elenco. La funzione di callback può quindi esaminare l'elemento e restituire true se corrisponde ad alcuni criteri.

In questo modo, abbiamo il meglio di due mondi: le persone intelligenti di jQuery creano il filtro e tu dici cosa esattamente cercare.

7

Una funzione di callback è "Un riferimento al codice eseguibile o un pezzo di codice eseguibile, che viene passato come argomento ad un altro codice".

Ecco un buon articolo per aiutare a capire che cosa è un "callback" function.

+1

+1 Credo che questa sarebbe la risposta più completa, corretta e semplice. È esattamente quello. – Trace

0

Cercando di ottenere un esempio più generale e semplice, ho capito quanto segue, e con argomenti ad esibirà un calcolo con due numeri: x e y .

function doMath (x,y,myMath) {return myMath(x,y);} 

function mult (a,b){return a*b;} 
function sum (a,b){return a+b;} 

alert(doMath(2,2,sum))  

dove myMath è la funzione di richiamata. Posso sostituirlo per qualsiasi funzione che voglio.

0

codice come questo

var result = db.query('select * from T'); //use result - Standard function 

il software non fa nulla e si sono solo in attesa per il database di rispondere. questo in qualche modo blocca l'intero processo o implica più stack di esecuzione. Ma una riga di codice come

db.query('select * from T',function(result){ 
    //use result - Callback function 
}); 

consente al programma di tornare immediatamente al ciclo degli eventi.

In questa esecuzione, Server rende tale richiesta e continuare a fare altre cose, quando la richiesta ritorna (dopo milioni di cicli di clock), è possibile eseguire la richiamata, tutto ciò che serve è il puntatore al richiama.

Problemi correlati