Come spiegare i callback in inglese? In che modo differiscono dal chiamare una funzione da un'altra funzione?


342

Come spiegare i callback in un inglese semplice? In che modo differiscono dal chiamare una funzione da un'altra funzione prendendo un contesto dalla funzione chiamante? Come può essere spiegato il loro potere a un programmatore alle prime armi?


1
Credo che il nome scientifico sia stile di continuazione. Puoi cercarlo su wiki.
ming_codes

1
Ci sono alcune buone risposte ad una domanda identica su Quora anche
DBR


La migliore spiegazione del callback che abbia mai trovato su youtube.com/watch?v=xHneyv38Jro
Sameer Sinha

Risposte:


114

Spesso un'applicazione deve eseguire diverse funzioni in base al suo contesto / stato. Per questo, usiamo una variabile in cui archiviamo le informazioni sulla funzione da chiamare. In base alle sue necessità, l'applicazione imposterà questa variabile con le informazioni sulla funzione da chiamare e chiamerà la funzione utilizzando la stessa variabile.

In javascript, l'esempio è di seguito. Qui utilizziamo l'argomento method come una variabile in cui archiviamo informazioni sulla funzione.

function processArray(arr, callback) {
    var resultArr = new Array(); 
    for (var i = arr.length-1; i >= 0; i--)
        resultArr[i] = callback(arr[i]);
    return resultArr;
}

var arr = [1, 2, 3, 4];
var arrReturned = processArray(arr, function(arg) {return arg * -1;});
// arrReturned would be [-1, -2, -3, -4]

18
Mentre questo è tecnicamente un richiamo, la spiegazione fornita suona indistinta da un puntatore a funzione generale. Sarebbe utile includere alcune motivazioni sul perché un callback potrebbe essere usato.
Eric

4
Non capisco questa risposta. Può essere più una spiegazione che un codice?
Abhishek Singh,

perché non possiamo fare quello che facciamo nella funzione richiamata (la function(arg)) nella processArray(arr,callback)funzione
Abhi

1
@JoSmo hai in parte ragione. Passare una variabile + funzione di richiamata come parametri che prendono il risultato creato con la variabile dalla funzione originale e passarla nella funzione di richiamata per un'ulteriore elaborazione. esempio: func1 (a, callback_func) {v = a + 1} e c'è una funzione di richiamata predefinita: callback_func (v) {return v + 1;} questo aumenterà a di 2, quindi se passi l'argomento dell'intero 4 in "a" parametro, callback_funct restituirà 6 come risultato. Leggi questa migliore fonte di callbackhell.com che ho trovato.
Dung

Questa risposta non è chiara Potrebbe essere più semplice e articolato!
Arjun Kalidas,

545

Proverò a mantenere questo morto semplice. Un "callback" è qualsiasi funzione chiamata da un'altra funzione che accetta la prima funzione come parametro. Molte volte, un "callback" è una funzione che viene chiamata quando succede qualcosa . Che qualcosa può essere chiamato un "evento" in linguaggio programmatore.

Immagina questo scenario: ti aspetti un pacchetto tra un paio di giorni. Il pacchetto è un regalo per il tuo vicino. Pertanto, una volta ricevuto il pacchetto, lo si desidera che venga portato ai vicini. Sei fuori città e quindi lasci le istruzioni per il tuo coniuge.

Potresti dire loro di prendere il pacco e portarlo ai vicini. Se il tuo coniuge fosse stupido come un computer, si siedono alla porta e aspettano il pacco fino a quando non arriva (NON FARE NESSUN ALTRO) e poi una volta arrivato lo porterebbero ai vicini. Ma c'è un modo migliore. Di 'al tuo coniuge che UNA VOLTA che ricevono il pacco, dovrebbero consegnarlo ai vicini. Quindi, possono andare in giro normalmente fino a quando non ricevono il pacco.

Nel nostro esempio, la ricezione del pacchetto è "l'evento" e il portarlo ai vicini è il "callback". Il coniuge "esegue" le istruzioni per consegnare il pacco solo quando arriva il pacco. Molto meglio!

Questo tipo di pensiero è evidente nella vita quotidiana, ma i computer non hanno lo stesso tipo di buon senso. Considera come i programmatori normalmente scrivono in un file:

fileObject = open(file)
# now that we have WAITED for the file to open, we can write to it
fileObject.write("We are writing to the file.")
# now we can continue doing the other, totally unrelated things our program does

Qui, ATTENDIAMO l'apertura del file, prima di scrivere su di esso. Questo "blocca" il flusso di esecuzione e il nostro programma non può fare nessuna delle altre cose che potrebbe essere necessario! E se potessimo farlo invece:

# we pass writeToFile (A CALLBACK FUNCTION!) to the open function
fileObject = open(file, writeToFile)
# execution continues flowing -- we don't wait for the file to be opened
# ONCE the file is opened we write to it, but while we wait WE CAN DO OTHER THINGS!

Si scopre che lo facciamo con alcune lingue e framework. È molto bello! Dai un'occhiata a Node.js per fare pratica con questo tipo di pensiero.


6
Questo è corretto, ma non copre tutti i casi d'uso comuni per i callback. Spesso si utilizzano i callback quando è necessario chiamare una funzione con argomenti che verrebbero elaborati nel processo di un'altra funzione. Ad esempio in PHP array_filter () e array_map () accettano che i callback vengano chiamati in un ciclo.
Haralan Dobrev,

2
L'esempio del file di scrittura è appropriato? Sembra fare ipotesi su come openfunziona. È plausibile che openpotrebbe bloccarsi internamente in attesa che il sistema operativo esegua la sua magia nera, su cui viene eseguita la richiamata. Non vi è alcuna differenza nel risultato in questo caso.
Kenneth K.,

23
Bella spiegazione, ma sto confondendo un po '. Callback è multithread?
Premraj,

1
Ottimo esempio! Stavo cercando un inglese semplice dappertutto e questo è il primo che ho trovato finora :)
ChristoKiwi

1
Cosa rende la funzione open nel tuo esempio non bloccante? open potrebbe ancora bloccare il flusso di esecuzione ..
Koray Tugay

82

Come spiegare i callback in un inglese semplice?

In parole povere, una funzione di callback è come un operaio che "richiama" al suo Direttore , quando ha completato un task .

In che modo differiscono dal chiamare una funzione da un'altra funzione prendendo un contesto dalla funzione chiamante?

È vero che stai chiamando una funzione da un'altra funzione, ma la chiave è che il callback è trattato come un oggetto, quindi puoi cambiare quale funzione chiamare in base allo stato del sistema (come il modello di progettazione strategica).

Come può essere spiegato il loro potere a un programmatore alle prime armi?

La potenza dei callback è facilmente visibile nei siti Web in stile AJAX che devono estrarre dati da un server. Il download dei nuovi dati potrebbe richiedere del tempo. Senza richiamate, l'intera interfaccia utente si "congela" durante il download dei nuovi dati, oppure è necessario aggiornare l'intera pagina anziché solo parte di essa. Con un callback, è possibile inserire un'immagine "caricamento in corso" e sostituirla con i nuovi dati una volta caricata.

Alcuni codici senza callback:

function grabAndFreeze() {
    showNowLoading(true);
    var jsondata = getData('http://yourserver.com/data/messages.json');
    /* User Interface 'freezes' while getting data */
    processData(jsondata);
    showNowLoading(false);
    do_other_stuff(); // not called until data fully downloaded
}

function processData(jsondata) { // do something with the data
   var count = jsondata.results ? jsondata.results.length : 0;
   $('#counter_messages').text(['Fetched', count, 'new items'].join(' '));
   $('#results_messages').html(jsondata.results || '(no new messages)');
}

Con callback:

Ecco un esempio con un callback, usando getJSON di jQuery :

function processDataCB(jsondata) { // callback: update UI with results
   showNowLoading(false);
   var count = jsondata.results ? jsondata.results.length : 0;
   $('#counter_messages').text(['Fetched', count, 'new items'].join(' '));
   $('#results_messages').html(jsondata.results || '(no new messages)');
}

function grabAndGo() { // and don't freeze
    showNowLoading(true);
    $('#results_messages').html(now_loading_image);
    $.getJSON("http://yourserver.com/data/messages.json", processDataCB);
    /* Call processDataCB when data is downloaded, no frozen User Interface! */
    do_other_stuff(); // called immediately
}

Con chiusura:

Spesso il callback deve accedere statedalla funzione di chiamata utilizzando a closure, che è come il lavoratore che ha bisogno di ottenere informazioni dal gestore prima di poter completare la sua attività . Per creare il closure, è possibile incorporare la funzione in modo che veda i dati nel contesto chiamante:

/* Grab messages, chat users, etc by changing dtable. Run callback cb when done.*/
function grab(dtable, cb) { 
    if (null == dtable) { dtable = "messages"; }
    var uiElem = "_" + dtable;
    showNowLoading(true, dtable);
    $('#results' + uiElem).html(now_loading_image);
    $.getJSON("http://yourserver.com/user/"+dtable+".json", cb || function (jsondata) {
       // Using a closure: can "see" dtable argument and uiElem variables above.
       var count = jsondata.results ? jsondata.results.length : 0, 
           counterMsg = ['Fetched', count, 'new', dtable].join(' '),
           // no new chatters/messages/etc
           defaultResultsMsg = ['(no new ', dtable, ')'].join(''); 
       showNowLoading(false, dtable);
       $('#counter' + uiElem).text(counterMsg);
       $('#results'+ uiElem).html(jsondata.results || defaultResultsMsg);
    });
    /* User Interface calls cb when data is downloaded */

    do_other_stuff(); // called immediately
}

Uso:

// update results_chatters when chatters.json data is downloaded:
grab("chatters"); 
// update results_messages when messages.json data is downloaded
grab("messages"); 
// call myCallback(jsondata) when "history.json" data is loaded:
grab("history", myCallback); 

Chiusura

Infine, ecco un definizione di closureda Douglas Crockford :

Le funzioni possono essere definite all'interno di altre funzioni. La funzione interna ha accesso alle variabili e ai parametri della funzione esterna. Se sopravvive un riferimento a una funzione interna (ad esempio, come una funzione di richiamata), sopravvivono anche i vars della funzione esterna.

Guarda anche:


12
+1. Il primo paragrafo è il botto . Tuttavia, il resto va in gergo informatico abbastanza rapidamente.
TarkaDaal,

41

Sono sbalordito nel vedere così tante persone intelligenti non riuscire a sottolineare la realtà che la parola "callback" è diventata usata in due modi incoerenti.

Entrambe le modalità comportano la personalizzazione di una funzione passando funzionalità aggiuntive (una definizione di funzione, anonima o denominata) a una funzione esistente. vale a dire.

customizableFunc(customFunctionality)

Se la funzionalità personalizzata viene semplicemente inserita nel blocco di codice, è stata personalizzata la funzione, in questo modo.

    customizableFucn(customFunctionality) {
      var data = doSomthing();
      customFunctionality(data);
      ...
    }

Sebbene questo tipo di funzionalità iniettata sia spesso chiamata "richiamata", non vi è nulla di contingente al riguardo. Un esempio molto ovvio è il metodo forEach in cui viene fornita una funzione personalizzata come argomento da applicare a ciascun elemento di un array per modificare l'array.

Ma questo è fondamentalmente distinto dall'uso delle funzioni di "callback" per la programmazione asincrona , come in AJAX o node.js o semplicemente nell'assegnare funzionalità agli eventi di interazione dell'utente (come i clic del mouse). In questo caso, l'intera idea è di attendere che si verifichi un evento contingente prima di eseguire la funzionalità personalizzata. Ciò è evidente nel caso dell'interazione dell'utente, ma è anche importante nei processi di I / O (input / output) che possono richiedere del tempo, come la lettura di file dal disco. È qui che il termine "callback" ha il significato più ovvio. Una volta avviato un processo di I / O (come richiedere la lettura di un file dal disco o un server per restituire i dati da una richiesta http) un asincronoil programma non aspetta che finisca. Può andare avanti con qualsiasi attività sia programmata successivamente e rispondere con la funzionalità personalizzata solo dopo che è stato notificato che il file di lettura o la richiesta http è stata completata (o che ha fallito) e che i dati sono disponibili per la funzionalità personalizzata. È come chiamare un'azienda al telefono e lasciare il tuo numero di "richiamata", in modo che possano chiamarti quando qualcuno è disponibile per risponderti. È meglio che restare in coda per chissà quanto tempo e non essere in grado di occuparsi di altri affari.

L'uso asincrono comporta intrinsecamente alcuni mezzi di ascolto dell'evento desiderato (ad esempio, il completamento del processo di I / O) in modo che, quando si verifica (e solo quando si verifica), viene eseguita la funzionalità personalizzata di "callback". Nell'ovvio esempio di AJAX, quando i dati arrivano effettivamente dal server, viene attivata la funzione "callback" per utilizzare quei dati per modificare il DOM e quindi ridisegnare la finestra del browser in quella misura.

Ricapitolando. Alcune persone usano la parola "callback" per riferirsi a qualsiasi tipo di funzionalità personalizzata che può essere iniettata in una funzione esistente come argomento. Ma, almeno per me, l'uso più appropriato della parola è dove la funzione di "callback" iniettata viene utilizzata in modo asincrono - per essere eseguita solo al verificarsi di un evento di cui è in attesa di essere notificata.


Quindi, quando la funzione richiama, dove ritorna il processo? Ad esempio, se ci sono quattro righe di codice; 1.fileObject = open (file, writeToFile); 2. doSomething1 (); 3. doSomething2 (); 4. doSomething3 ().
MagicLAMP,

La riga 1 viene eseguita, ma invece di attendere l'apertura del file, passa alla riga 2, quindi 3. A quel punto il file si apre e (una volta che la riga 3 ha terminato qualsiasi operazione del semaforo) richiama il contatore del programma per dire " passa il controllo a writeToFile "che fa cose, e quando è finito passa il controllo al punto in cui INT si è verificato nella riga 3, oppure alla riga 4 se la riga 3 ha terminato.
MagicLAMP,

1
Questa è una spiegazione molto articolata di un altro punto importante: ad esempio la differenza tra la funzione passata come arg a Array.prototype.forEach()e la funzione passata come arg a setTimeout(), e sono cavalli di diversi colori per quanto riguarda il modo in cui ragionate sul vostro programma .
mikermcneil,

26

In termini non programmatori, un callback è un riempimento in bianco in un programma.

Un elemento comune su molti moduli cartacei è "Persona da chiamare in caso di emergenza". C'è una linea vuota lì. Scrivi il nome e il numero di telefono di qualcuno. Se si verifica un'emergenza, quella persona viene chiamata.

  • Tutti ottengono lo stesso modulo vuoto, ma
  • Tutti possono scrivere un numero di contatto di emergenza diverso.

Questa è la chiave. Non modifichi il modulo (il codice, di solito quello di qualcun altro). Tuttavia, puoi inserire informazioni mancanti (il tuo numero).

Esempio 1:

I callback sono usati come metodi personalizzati, possibilmente per aggiungere / modificare il comportamento di un programma. Ad esempio, prendi del codice C che esegue una funzione, ma non sa come stampare l'output. Tutto ciò che può fare è creare una stringa. Quando cerca di capire cosa fare della stringa, vede una riga vuota. Ma il programmatore ti ha dato il vuoto per scrivere il tuo callback!

In questo esempio, non si utilizza una matita per riempire uno spazio vuoto su un foglio di carta, si utilizza la funzione set_print_callback(the_callback).

  • La variabile vuota nel modulo / codice è la riga vuota,
  • set_print_callback è la matita,
  • ed the_callbackè la tua informazione che stai compilando.

Ora hai inserito questa riga vuota nel programma. Ogni volta che deve stampare l'output, guarderà quella riga vuota e seguirà le istruzioni lì (cioè chiama la funzione che hai messo lì.) In pratica, ciò consente la possibilità di stampare sullo schermo, su un file di registro, su una stampante, tramite una connessione di rete o qualsiasi combinazione di questi. Hai riempito lo spazio vuoto con quello che vuoi fare.

Esempio 2:

Quando ti viene detto che devi chiamare un numero di emergenza, vai a leggere ciò che è scritto sul modulo cartaceo, quindi chiama il numero che leggi. Se quella riga è vuota non verrà fatto nulla.

La programmazione della Gui funziona allo stesso modo. Quando si fa clic su un pulsante, il programma deve capire cosa fare dopo. Va e cerca il callback. Questo callback si trova in uno spazio vuoto con l'etichetta "Ecco cosa fai quando si fa clic su Button1"

La maggior parte degli IDE riempirà automaticamente lo spazio vuoto per te (scrivi il metodo di base) quando lo chiedi (ad es button1_clicked.). Tuttavia, questo spazio vuoto può avere qualsiasi metodo dannatamente valido, per favore . È possibile chiamare il metodo run_computationso butter_the_biscuitspurché si inserisca il nome del callback nello spazio vuoto appropriato. È possibile inserire "555-555-1212" nel numero di emergenza vuoto. Non ha molto senso, ma è lecito.


Nota finale: quella riga vuota che stai compilando con il callback? Può essere cancellato e riscritto a piacimento. (se dovresti o meno è un'altra domanda, ma questa è una parte del loro potere)


22

Sempre meglio iniziare con un esempio :).

Supponiamo che tu abbia due moduli A e B.

Vuoi che il modulo A sia avvisato quando si verificano alcuni eventi / condizioni nel modulo B. Tuttavia, il modulo B non ha idea del proprio modulo A. Tutto quello che sa è un indirizzo a una particolare funzione (del modulo A) attraverso un puntatore a funzione che è fornito dal modulo A.

Quindi tutto ciò che B deve fare ora è "richiamare" nel modulo A quando si verifica un particolare evento / condizione usando il puntatore a funzione. A può eseguire ulteriori elaborazioni all'interno della funzione di callback.

*) Un chiaro vantaggio qui è che stai estraendo tutto ciò che riguarda il modulo A dal modulo B. Il modulo B non deve preoccuparsi di chi / quale modulo A sia.


Quindi, i parametri della funzione in A sono forniti nel modulo B, è corretto?
U.Savas il

21

Immagina di aver bisogno di una funzione che ritorni 10 quadrati in modo da scrivere una funzione:

function tenSquared() {return 10*10;}

Successivamente hai bisogno di 9 quadrati in modo da scrivere un'altra funzione:

function nineSquared() {return 9*9;}

Alla fine sostituirai tutti questi con una funzione generica:

function square(x) {return x*x;}

Lo stesso pensiero vale per i callback. Hai una funzione che fa qualcosa e al termine chiama doA:

function computeA(){
    ...
    doA(result);
}

Successivamente si desidera che la stessa identica funzione chiami doB, invece è possibile duplicare l'intera funzione:

function computeB(){
    ...
    doB(result);
}

Oppure potresti passare una funzione di callback come variabile e devi avere la funzione solo una volta:

function compute(callback){
    ...
    callback(result);
}

Quindi devi solo chiamare il calcolo (doA) e il calcolo (doB).

Oltre a semplificare il codice, consente al codice asincrono di informarti che è stato completato chiamando la tua funzione arbitraria al completamento, simile a quando chiami qualcuno al telefono e lasci un numero di richiamata.


Quindi stai passando la funzione come parametro. Tutto il linguaggio di programmazione consente di passare la funzione come parametro? In caso negativo, puoi mostrare un esempio su come implementare la funzione di callback in quella lingua.
Quazi Irfan,

21

Johny il programmatore ha bisogno di una pinzatrice, quindi va al reparto forniture per ufficio e ne chiede una, dopo aver compilato il modulo di richiesta può stare lì e aspettare che l'impiegato vada a cercare nel magazzino la pinzatrice (come una chiamata di funzione di blocco ) o vai a fare qualcos'altro nel frattempo.

dato che di solito ci vuole tempo, Johnny mette un appunto insieme al modulo di richiesta chiedendo loro di chiamarlo quando la cucitrice è pronta per il ritiro, quindi nel frattempo può fare qualcos'altro come fare un sonnellino sulla sua scrivania.


1
Questo sembra un po 'più simile alle promesse che ai richiami: blog.jcoglan.com/2013/03/30/…
Thomas

2
Le promesse sono solo zucchero sintattico attorno ai callback.
Deven Phillips,

11

Ti senti male, quindi vai dal dottore. Ti esamina e determina che hai bisogno di cure mediche. Ti prescrive alcuni medicinali e chiama la prescrizione nella tua farmacia locale. Vai a casa. Successivamente la tua farmacia chiama per dirti che la tua prescrizione è pronta. Vai a prenderlo.


Ottima analogia. Potresti ampliare un po 'di più, magari con alcuni (semplici) esempi relativi alla programmazione?
a20

10

Ci sono due punti da spiegare, uno è come funziona un callback (passando attorno a una funzione che può essere chiamata senza alcuna conoscenza del suo contesto), l'altro a cosa serve (gestire gli eventi in modo asincrono).

L'analogia dell'attesa dell'arrivo di un pacco utilizzato da altre risposte è una buona spiegazione di entrambi. In un programma per computer, diresti al computer di aspettarsi un pacco. Di solito, ora starebbe lì seduto ad aspettare (e non fare nient'altro) fino all'arrivo del pacco, possibilmente a tempo indeterminato se non arriva mai. Per gli umani, questo sembra sciocco, ma senza ulteriori misure, questo è totalmente naturale per un computer.

Ora il callback sarebbe il campanello della tua porta di casa. Fornisci al servizio pacchi un modo per avvisarti dell'arrivo del pacco senza che debbano sapere dove (anche se) sei in casa o come funziona la campana. (Ad esempio, alcuni "campanelli" in realtà inviano una telefonata.) Poiché hai fornito una "funzione di richiamata" che può essere "chiamata" in qualsiasi momento, fuori dal contesto, ora puoi smettere di sederti nella veranda e "gestire il evento "(di arrivo del pacco) ogni volta che è il momento.


Questo è un inglese semplice.
Jeb50,

Questa sembra essere la migliore spiegazione!
Vishal Sharma,

6

Immagina che un amico lasci la tua casa e le dici "Chiamami quando torni a casa in modo che io sappia che sei arrivato sano e salvo"; questa è (letteralmente) una richiamata . Ecco cos'è una funzione di callback, indipendentemente dalla lingua. Volete che una procedura vi restituisca il controllo quando ha completato qualche attività, quindi dategli una funzione da usare per richiamarvi.

In Python, ad esempio,

grabDBValue( (lambda x: passValueToGUIWindow(x) ))

grabDBValuepotrebbe essere scritto per prendere solo un valore da un database e quindi consentire di specificare cosa fare effettivamente con il valore, quindi accetta una funzione. Non sai quando o se grabDBValuetornerà, ma se / quando lo fa, sai cosa vuoi che faccia. Qui, passo in una funzione anonima (o lambda ) che invia il valore a una finestra della GUI. Potrei facilmente cambiare il comportamento del programma facendo questo:

grabDBValue( (lambda x: passToLogger(x) ))

I callback funzionano bene nei linguaggi in cui le funzioni sono valori di prima classe , proprio come i soliti numeri interi, stringhe di caratteri, valori booleani, ecc. In C, è possibile "passare" una funzione passando un puntatore attorno ad essa e il chiamante può usarla; in Java, il chiamante chiederà una classe statica di un certo tipo con un certo nome di metodo poiché non ci sono funzioni ("metodi", davvero) al di fuori delle classi; e nella maggior parte degli altri linguaggi dinamici puoi semplicemente passare una funzione con una sintassi semplice.

PROTIP:

Nelle lingue con ambito lessicale (come Scheme o Perl) puoi fare un trucco come questo:

my $var = 2;
my $val = someCallerBackFunction(sub callback { return $var * 3; });
# Perlistas note: I know the sub doesn't need a name, this is for illustration

$valin questo caso sarà 6perché il callback ha accesso alle variabili dichiarate nell'ambiente lessicale in cui è stata definita. Ambito lessicale e richiamate anonime sono una potente combinazione che garantisce ulteriori studi per il programmatore principiante.


1
+1. In realtà mi piace abbastanza questa risposta. La spiegazione di ciò che un callback è , è semplice e concisa.
TarkaDaal,

6

Hai del codice che vuoi eseguire. Normalmente, quando lo chiami, stai aspettando che finisca prima di continuare (il che può far sì che l'app diventi grigia / produca un tempo di rotazione per un cursore).

Un metodo alternativo consiste nell'eseguire questo codice in parallelo e continuare con il proprio lavoro. Ma cosa succede se il tuo codice originale deve fare cose diverse a seconda della risposta dal codice che ha chiamato? Bene, in quel caso puoi passare il nome / la posizione del codice che vuoi che chiami al termine. Questo è un "richiamo".

Codice normale: Richiedi informazioni-> Informazioni processo-> Gestisci i risultati dell'elaborazione-> Continua a fare altre cose.

Con i callback: chiedi informazioni-> informazioni di processo-> continua a fare altre cose. E in un secondo momento-> Gestire i risultati dell'elaborazione.


6

Senza callback né altre risorse di programmazione speciali (come il threading e altre), un programma è esattamente una sequenza di istruzioni che vengono eseguite in sequenza una dopo l'altra e anche con una sorta di "comportamento dinamico" determinato da determinate condizioni, tutti i possibili scenari deve essere programmato in precedenza .

Quindi, se dobbiamo fornire un comportamento dinamico reale a un programma, possiamo usare il callback. Con il callback è possibile indicare ai parametri, un programma di chiamare un altro programma che fornisce alcuni parametri precedentemente definiti e può aspettarsi alcuni risultati ( questa è la firma del contratto o dell'operazione ), quindi questi risultati possono essere prodotti / elaborati da un programma di terze parti che non era precedentemente noto.

Questa tecnica è il fondamento del polimorfismo applicato a programmi, funzioni, oggetti e tutte le altre unità di codice gestite dai computer.

Il mondo umano usato come esempio per richiamare è ben spiegato quando stai facendo un lavoro, supponiamo che tu sia un pittore ( qui sei il programma principale, che dipinge ) e chiama il tuo cliente a volte per chiedergli di approvare il risultato del tuo lavoro , quindi, decide se l'immagine è buona (il tuo client è il programma di terze parti ).

Nell'esempio sopra sei un pittore e "deleghi" ad altri il lavoro per approvare il risultato, l'immagine è il parametro e ogni nuovo cliente (la "funzione" richiamata) cambia il risultato del tuo lavoro decidendo ciò che vuole sull'immagine ( la decisione presa dai clienti è il risultato restituito dalla "funzione di callback" ).

Spero che questa spiegazione possa essere utile.


6

Facciamo finta che mi avresti assegnato un compito potenzialmente di lunga durata: ottenere i nomi delle prime cinque persone uniche che incontri. Questo potrebbe richiedere giorni se mi trovo in un'area scarsamente popolata. Non sei davvero interessato a sederti sulle tue mani mentre corro, quindi dici: "Quando hai l'elenco, chiamami sul mio cellulare e leggilo a me. Ecco il numero".

Mi hai fornito un riferimento di richiamata, una funzione che dovrei eseguire per poter trasferire ulteriori elaborazioni.

In JavaScript potrebbe essere simile a questo:

var lottoNumbers = [];
var callback = function(theNames) {
  for (var i=0; i<theNames.length; i++) {
    lottoNumbers.push(theNames[i].length);
  }
};

db.executeQuery("SELECT name " +
                "FROM tblEveryOneInTheWholeWorld " +
                "ORDER BY proximity DESC " +
                "LIMIT 5", callback);

while (lottoNumbers.length < 5) {
  playGolf();
}
playLotto(lottoNumbers);

Questo potrebbe probabilmente essere migliorato in molti modi. Ad esempio, potresti fornire un secondo callback: se finisce per impiegare più di un'ora, chiama il telefono rosso e comunica alla persona che risponde che è scaduto.


6

I callback sono descritti più facilmente in termini di sistema telefonico. Una chiamata di funzione è analoga a chiamare qualcuno al telefono, farle una domanda, ottenere una risposta e riagganciare; l'aggiunta di una richiamata modifica l'analogia in modo che dopo averle fatto una domanda, le dia anche il tuo nome e numero in modo che possa richiamarti con la risposta. - Paul Jakubik, "Implementazioni callback in C ++"


Una spiegazione più semplice sarebbe: chiamo qualcuno, è in riunione, lascio un numero di telefono, chiama lei.
Solitario

5

Un callback è una funzione che verrà chiamata da una seconda funzione. Questa seconda funzione non sa in anticipo quale funzione chiamerà. Quindi l' identità della funzione di callback viene memorizzata da qualche parte o passata alla seconda funzione come parametro. Questa "identità", a seconda del linguaggio di programmazione, potrebbe essere l'indirizzo del callback, o qualche altro tipo di puntatore, oppure potrebbe essere il nome della funzione. Il principale è lo stesso, archiviamo o passiamo alcune informazioni che identificano in modo inequivocabile la funzione.

Quando arriva il momento, la seconda funzione può richiamare il callback, fornendo parametri a seconda delle circostanze in quel momento. Potrebbe persino scegliere il callback da una serie di possibili callback. Il linguaggio di programmazione deve fornire una sorta di sintassi per consentire alla seconda funzione di chiamare il callback, conoscendo la sua "identità".

Questo meccanismo ha molti usi possibili. Con i callback, il progettista di una funzione può lasciarla personalizzare facendola chiamare qualunque callback sia fornito. Ad esempio, una funzione di ordinamento potrebbe accettare un callback come parametro e questo callback potrebbe essere una funzione per confrontare due elementi per decidere quale viene prima.

A proposito, a seconda del linguaggio di programmazione, la parola "funzione" nella discussione sopra potrebbe essere sostituita da "blocco", "chiusura", "lambda", ecc.


5

Di solito abbiamo inviato variabili alle funzioni. Supponiamo di avere un'attività in cui la variabile deve essere elaborata prima di essere fornita come argomento: è possibile utilizzare la richiamata.

function1(var1, var2) è il solito modo.

Cosa succede se desidero var2essere elaborato e quindi inviato come argomento? function1(var1, function2(var2))

Questo è un tipo di callback: function2esegue un codice e restituisce una variabile alla funzione iniziale.


2
Qual è un altro tipo di callback?
johnny,

@johnny: ci sono normali callback del browser che vengono attivati ​​quando viene completato un Ajax ecc.
Nishant

4

Una spiegazione metaforica:

Ho un pacco che voglio consegnare a un amico e voglio anche sapere quando il mio amico lo riceve.

Quindi porto il pacco all'ufficio postale e chiedo loro di consegnarlo. Se voglio sapere quando il mio amico riceve il pacco, ho due opzioni:

(a) Posso aspettare all'ufficio postale fino alla consegna.

(b) Riceverò un'email al momento della consegna.

L'opzione (b) è analoga a una richiamata.


4

Per insegnare i callback, devi prima insegnare il puntatore. Una volta che gli studenti avranno compreso l'idea del puntatore a una variabile, l'idea dei callback diventerà più facile. Supponendo che si stia utilizzando C / C ++, è possibile seguire questi passaggi.

  • Prima mostra ai tuoi studenti come usare e manipolare le variabili usando i puntatori insieme ai normali identificatori di variabili.
  • Quindi insegna loro che ci sono cose che possono essere fatte solo con i puntatori (come passare una variabile per riferimento).
  • Quindi dì loro come il codice o le funzioni eseguibili sono proprio come alcuni altri dati (o variabili) nella memoria. Quindi, le funzioni hanno anche indirizzi o puntatori.
  • Quindi mostra loro come si possono chiamare le funzioni con i puntatori a funzione e dire loro che si chiamano callback.
  • Ora, la domanda è: perché tutte queste seccature per chiamare alcune funzioni? Qual è il vantaggio? Come i puntatori di dati, anche il puntatore a funzione o callback presenta alcuni vantaggi rispetto all'uso di identificatori normali.
  • Il primo è, identificatori di funzione o nomi di funzioni non possono essere usati come dati normali. Voglio dire, non è possibile creare una struttura di dati con funzioni (come una matrice o un elenco collegato di funzioni). Ma con i callback, puoi creare un array, un elenco collegato o usarli con altri dati come nel dizionario delle coppie chiave-valore o degli alberi, o qualsiasi altra cosa. Questo è un grande vantaggio. E altri benefici sono in realtà figli di questo.
  • L'uso più comune dei callback è visto nella programmazione del driver di eventi. Dove una o più funzioni vengono eseguite in base ad alcuni segnali in entrata. Con i callback, è possibile gestire un dizionario per mappare i segnali con i callback. Quindi la risoluzione del segnale di ingresso e l'esecuzione del codice corrispondente diventano molto più facili.
  • Il secondo uso dei callback che mi vengono in mente sono le funzioni di ordine superiore. Le funzioni che accettano altre funzioni come argomenti di input. E per inviare funzioni come argomenti, abbiamo bisogno di callback. Un esempio può essere una funzione che accetta un array e un callback. Quindi esegue il callback su ciascuno degli elementi dell'array e restituisce i risultati in un altro array. Se passiamo alla funzione un callback raddoppiato, otteniamo un array valutato raddoppiato. Se superiamo una callback quadrata, otteniamo dei quadrati. Per le radici quadrate, basta inviare il callback appropriato. Questo non può essere fatto con le normali funzioni.

Potrebbero esserci molte più cose. Coinvolgi gli studenti e loro scopriranno. Spero che questo ti aiuti.


1
Un'altra mia risposta riguardava questo argomento in programmers.SE programmers.stackexchange.com/a/75449/963
Gulshan

3

In parole povere una richiamata è una promessa. Joe, Jane, David e Samantha condividono un carpool per lavorare. Joe sta guidando oggi. Jane, David e Samantha hanno un paio di opzioni:

  1. Controlla la finestra ogni 5 minuti per vedere se Joe è fuori
  2. Continua a fare le loro cose fino a quando Joe suona il campanello della porta.

Opzione 1: questo è più simile a un esempio di polling in cui Jane sarebbe bloccata in un "ciclo" per verificare se Joe è fuori. Jane non può fare nient'altro nel frattempo.

Opzione 2: questo è l'esempio di richiamata. Jane dice a Joe di suonare il suo campanello quando è fuori. Gli dà una "funzione" per suonare il campanello della porta. Joe non ha bisogno di sapere come funziona il campanello della porta o dove si trova, deve solo chiamare quella funzione, cioè suonare il campanello della porta quando è lì.

I callback sono guidati da "eventi". In questo esempio l '"evento" è l'arrivo di Joe. In Ajax, ad esempio, gli eventi possono essere "esito positivo" o "esito negativo" della richiesta asincrona e ognuno può avere richiamate uguali o diverse.

In termini di applicazioni JavaScript e callback. Dobbiamo anche comprendere le "chiusure" e il contesto dell'applicazione. Ciò a cui si riferisce "questo" può facilmente confondere gli sviluppatori JavaScript. In questo esempio all'interno del metodo / callback "ring_the_door_bell ()" di ogni persona potrebbero esserci altri metodi che ogni persona deve fare in base alla sua routine mattutina es. "Spegni la televisione()". Vorremmo che "questo" si riferisse all'oggetto "Jane" o all'oggetto "David" in modo che ognuno possa impostare qualsiasi altra cosa prima che Joe lo raccolga. Qui è dove impostare il callback con Joe richiede la parodia del metodo in modo che "this" si riferisca all'oggetto giusto.

Spero che aiuti!


3

Un callback è una busta timbrata autoindirizzata. Quando si chiama una funzione, è come inviare una lettera. Se si desidera che quella funzione chiami un'altra funzione, si forniscono tali informazioni sotto forma di riferimento o indirizzo.


3

Penso che sia un compito piuttosto semplice da spiegare.

Al primo richiamo sono solo normali funzioni.
E inoltre, chiamiamo questa funzione (chiamiamola A) dall'interno di un'altra funzione (chiamiamola B).

La magia di questo è che decido, quale funzione dovrebbe essere chiamata dalla funzione dall'esterno B.

Al momento scrivo la funzione BI non so quale funzione di callback debba essere chiamata. Al momento chiamo la funzione BI e dico anche a questa funzione di chiamare la funzione A. Questo è tutto.


3

Che cos'è una funzione di richiamata?

La semplice risposta a questa prima domanda è che una funzione di callback è una funzione chiamata tramite un puntatore a funzione. Se si passa il puntatore (indirizzo) di una funzione come argomento a un'altra, quando si utilizza quel puntatore per chiamare la funzione a cui punta si dice che viene effettuata una richiamata.

La funzione di callback è difficile da rintracciare, ma a volte è molto utile. Soprattutto quando si progettano librerie. La funzione di richiamata è come chiedere al tuo utente di darti un nome di funzione e la chiamerai a determinate condizioni.

Ad esempio, si scrive un timer di richiamata. Consente di specificare la durata e quale funzione chiamare e la funzione verrà richiamata di conseguenza. "Esegui myfunction () ogni 10 secondi per 5 volte"

Oppure puoi creare una directory di funzioni, passando un elenco di nomi di funzioni e chiedere alla libreria di richiamare di conseguenza. "Callback success () in caso di successo, callback fail () se fallito."

Vediamo un semplice esempio di puntatore a funzione

void cbfunc()
{
     printf("called");
}

 int main ()
 {
                   /* function pointer */ 
      void (*callback)(void); 
                   /* point to your callback function */ 
      callback=(void *)cbfunc; 
                   /* perform callback */
      callback();
      return 0; 
}

Come passare l'argomento alla funzione di callback?

Osservato che il puntatore a funzione per implementare il callback prende in void *, il che indica che può accettare qualsiasi tipo di variabile inclusa la struttura. Pertanto è possibile passare più argomenti per struttura.

typedef struct myst
{
     int a;
     char b[10];
}myst;

void cbfunc(myst *mt) 
{
     fprintf(stdout,"called %d %s.",mt->a,mt->b); 
}

int main() 
{
       /* func pointer */
    void (*callback)(void *);       //param
     myst m;
     m.a=10;
     strcpy(m.b,"123");       
     callback = (void*)cbfunc;    /* point to callback function */
     callback(&m);                /* perform callback and pass in the param */
     return 0;   
}

2

Un callback è un metodo pianificato per l'esecuzione quando viene soddisfatta una condizione.

Un esempio di "mondo reale" è un negozio di videogiochi locale. Stai aspettando Half-Life 3. Invece di andare al negozio ogni giorno per vedere se è presente, registri la tua e-mail in un elenco per ricevere una notifica quando il gioco è disponibile. L'email diventa il tuo "callback" e la condizione da soddisfare è la disponibilità del gioco.

Un esempio di "programmatori" è una pagina Web in cui si desidera eseguire un'azione quando si fa clic su un pulsante. Registrare un metodo di richiamata per un pulsante e continuare a svolgere altre attività. Quando / se l'utente preme il pulsante, il browser guarderà l'elenco dei callback per quell'evento e chiamerà il tuo metodo.

Un callback è un modo per gestire gli eventi in modo asincrono. Non si può mai sapere quando verrà eseguito il callback o se verrà eseguito affatto. Il vantaggio è che libera i cicli del programma e della CPU per eseguire altre attività in attesa della risposta.


Dire che è "programmato" potrebbe causare confusione qui. I callback sono spesso usati in sistemi asincroni e non ci sarebbe una "pianificazione" ma un "evento" che innesca l'esecuzione del callback.
Deven Phillips,

2

Chiaro e semplice: un callback è una funzione assegnata a un'altra funzione, in modo che possa chiamarla .

Di solito viene chiamato quando viene completata un'operazione. Poiché si crea il callback prima di assegnarlo all'altra funzione, è possibile inizializzarlo con le informazioni di contesto dal sito di chiamata. Ecco perché è chiamato call * back * - la prima funzione richiama nel contesto da cui è stata chiamata.


2

“Nella programmazione per computer, un callback è un riferimento al codice eseguibile, o un pezzo di codice eseguibile, che viene passato come argomento ad altro codice. Ciò consente a un livello software di livello inferiore di chiamare una subroutine (o funzione) definita in un livello di livello superiore. " - Wikipedia

Richiamata in C usando il puntatore a funzione

In C, il callback viene implementato utilizzando il puntatore a funzione. Puntatore a funzione - come suggerisce il nome, è un puntatore a una funzione.

Ad esempio, int (* ptrFunc) ();

Qui, ptrFunc è un puntatore a una funzione che non accetta argomenti e restituisce un numero intero. NON dimenticare di inserire la parentesi, altrimenti il ​​compilatore supporrà che ptrFunc sia un normale nome di funzione, che non accetta nulla e restituisce un puntatore a un numero intero.

Ecco un po 'di codice per dimostrare il puntatore alla funzione.

#include<stdio.h>
int func(int, int);
int main(void)
{
    int result1,result2;
    /* declaring a pointer to a function which takes
       two int arguments and returns an integer as result */
    int (*ptrFunc)(int,int);

    /* assigning ptrFunc to func's address */                    
    ptrFunc=func;

    /* calling func() through explicit dereference */
    result1 = (*ptrFunc)(10,20);

    /* calling func() through implicit dereference */        
    result2 = ptrFunc(10,20);            
    printf("result1 = %d result2 = %d\n",result1,result2);
    return 0;
}

int func(int x, int y)
{
    return x+y;
}

Ora proviamo a capire il concetto di Callback in C usando il puntatore a funzione.

Il programma completo ha tre file: callback.c, reg_callback.h e reg_callback.c.

/* callback.c */
#include<stdio.h>
#include"reg_callback.h"

/* callback function definition goes here */
void my_callback(void)
{
    printf("inside my_callback\n");
}

int main(void)
{
    /* initialize function pointer to
    my_callback */
    callback ptr_my_callback=my_callback;                        
    printf("This is a program demonstrating function callback\n");
    /* register our callback function */
    register_callback(ptr_my_callback);                          
    printf("back inside main program\n");
    return 0;
}

/* reg_callback.h */
typedef void (*callback)(void);
void register_callback(callback ptr_reg_callback);


/* reg_callback.c */
#include<stdio.h>
#include"reg_callback.h"

/* registration goes here */
void register_callback(callback ptr_reg_callback)
{
    printf("inside register_callback\n");
    /* calling our callback function my_callback */
    (*ptr_reg_callback)();                               
}

Se eseguiamo questo programma, l'output sarà

Questo è un programma che dimostra la funzione di callback all'interno di register_callback all'interno di my_callback e di nuovo all'interno del programma principale

La funzione di livello superiore chiama una funzione di livello inferiore come una normale chiamata e il meccanismo di richiamata consente alla funzione di livello inferiore di chiamare la funzione di livello superiore tramite un puntatore a una funzione di richiamata.

Richiamata in Java tramite l'interfaccia

Java non ha il concetto di puntatore a funzione Implementa il meccanismo Callback attraverso il suo meccanismo di interfaccia Qui invece di un puntatore a funzione, dichiariamo un'interfaccia con un metodo che verrà chiamato quando la chiamata termina il suo compito

Vorrei dimostrarlo con un esempio:

L'interfaccia di callback

public interface Callback
{
    public void notify(Result result);
}

Il chiamante o la classe di livello superiore

public Class Caller implements Callback
{
Callee ce = new Callee(this); //pass self to the callee

//Other functionality
//Call the Asynctask
ce.doAsynctask();

public void notify(Result result){
//Got the result after the callee has finished the task
//Can do whatever i want with the result
}
}

La funzione Chiamata o livello inferiore

public Class Callee {
Callback cb;
Callee(Callback cb){
this.cb = cb;
}

doAsynctask(){
//do the long running task
//get the result
cb.notify(result);//after the task is completed, notify the caller
}
}

Richiamata mediante il modello EventListener

  • Voce di elenco

Questo modello viene utilizzato per notificare da 0 a n numeri di osservatori / ascoltatori che una determinata attività è terminata

  • Voce di elenco

La differenza tra il meccanismo di callback e il meccanismo EventListener / Observer è che nel callback, la chiamata notifica al singolo chiamante, mentre in Eventlisener / Observer, la chiamata può notificare a chiunque sia interessato a quell'evento (la notifica può andare ad alcune altre parti del applicazione che non ha attivato l'attività)

Lasciami spiegare con un esempio.

L'interfaccia dell'evento

public interface Events {

public void clickEvent();
public void longClickEvent();
}

Widget di classe

package com.som_itsolutions.training.java.exampleeventlistener;

import java.util.ArrayList;
import java.util.Iterator;

public class Widget implements Events{

    ArrayList<OnClickEventListener> mClickEventListener = new ArrayList<OnClickEventListener>(); 
    ArrayList<OnLongClickEventListener> mLongClickEventListener = new ArrayList<OnLongClickEventListener>();

    @Override
    public void clickEvent() {
        // TODO Auto-generated method stub
        Iterator<OnClickEventListener> it = mClickEventListener.iterator();
                while(it.hasNext()){
                    OnClickEventListener li = it.next();
                    li.onClick(this);
                }   
    }
    @Override
    public void longClickEvent() {
        // TODO Auto-generated method stub
        Iterator<OnLongClickEventListener> it = mLongClickEventListener.iterator();
        while(it.hasNext()){
            OnLongClickEventListener li = it.next();
            li.onLongClick(this);
        }

    }

    public interface OnClickEventListener
    {
        public void onClick (Widget source);
    }

    public interface OnLongClickEventListener
    {
        public void onLongClick (Widget source);
    }

    public void setOnClickEventListner(OnClickEventListener li){
        mClickEventListener.add(li);
    }
    public void setOnLongClickEventListner(OnLongClickEventListener li){
        mLongClickEventListener.add(li);
    }
}

Pulsante di classe

public class Button extends Widget{
private String mButtonText;
public Button (){
} 
public String getButtonText() {
return mButtonText;
}
public void setButtonText(String buttonText) {
this.mButtonText = buttonText;
}
}

Casella di controllo della classe

public class CheckBox extends Widget{
private boolean checked;
public CheckBox() {
checked = false;
}
public boolean isChecked(){
return (checked == true);
}
public void setCheck(boolean checked){
this.checked = checked;
}
}

Classe di attività

pacchetto com.som_itsolutions.training.java.exampleeventlistener;

public class Activity implements Widget.OnClickEventListener
{
    public Button mButton;
    public CheckBox mCheckBox;
    private static Activity mActivityHandler;
    public static Activity getActivityHandle(){
        return mActivityHandler;
    }
    public Activity ()
    {
        mActivityHandler = this;
        mButton = new Button();
        mButton.setOnClickEventListner(this);
        mCheckBox = new CheckBox();
        mCheckBox.setOnClickEventListner(this);
        } 
    public void onClick (Widget source)
    {
        if(source == mButton){
            mButton.setButtonText("Thank you for clicking me...");
            System.out.println(((Button) mButton).getButtonText());
        }
        if(source == mCheckBox){
            if(mCheckBox.isChecked()==false){
                mCheckBox.setCheck(true);
                System.out.println("The checkbox is checked...");
            }
            else{
                mCheckBox.setCheck(false);
                System.out.println("The checkbox is not checked...");
            }       
        }
    }
    public void doSomeWork(Widget source){
        source.clickEvent();
    }   
}

Altra classe

public class OtherClass implements Widget.OnClickEventListener{
Button mButton;
public OtherClass(){
mButton = Activity.getActivityHandle().mButton;
mButton.setOnClickEventListner(this);//interested in the click event                        //of the button
}
@Override
public void onClick(Widget source) {
if(source == mButton){
System.out.println("Other Class has also received the event notification...");
}
}

Classe principale

public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Activity a = new Activity();
OtherClass o = new OtherClass();
a.doSomeWork(a.mButton);
a.doSomeWork(a.mCheckBox);
}
}

Come puoi vedere dal codice sopra, che abbiamo un'interfaccia chiamata eventi che sostanzialmente elenca tutti gli eventi che possono accadere per la nostra applicazione. La classe Widget è la classe base per tutti i componenti dell'interfaccia utente come Button, Checkbox. Questi componenti dell'interfaccia utente sono gli oggetti che ricevono effettivamente gli eventi dal codice del framework. La classe Widget implementa l'interfaccia Eventi e ha anche due interfacce nidificate, ovvero OnClickEventListener e OnLongClickEventListener

Queste due interfacce sono responsabili dell'ascolto di eventi che possono verificarsi sui componenti dell'interfaccia utente derivati ​​dal Widget come Button o Checkbox. Quindi, se confrontiamo questo esempio con il precedente esempio di Callback usando l'interfaccia Java, queste due interfacce funzionano come l'interfaccia di Callback. Quindi il codice di livello superiore (Here Activity) implementa queste due interfacce. E ogni volta che si verifica un evento su un widget, verrà chiamato il codice di livello superiore (o il metodo di queste interfacce implementato nel codice di livello superiore, che è qui Attività).

Ora lasciami discutere la differenza di base tra il modello Callback e Eventlistener. Come abbiamo detto che utilizzando Callback, Callee può notificare solo un singolo chiamante. Ma nel caso del modello EventListener, qualsiasi altra parte o classe dell'applicazione può registrarsi per gli eventi che possono verificarsi sul pulsante o sulla casella di controllo. L'esempio di questo tipo di classe è OtherClass. Se vedi il codice di OtherClass, scoprirai che si è registrato come listener di ClickEvent che può verificarsi nel pulsante definito nell'attività. La parte interessante è che, oltre all'attività (il chiamante), questa OtherClass verrà anche avvisata ogni volta che si verifica l'evento click sul pulsante.


1

Callbacks consente di inserire il proprio codice in un altro blocco di codice da eseguire in un altro momento, che modifica o aggiunge il comportamento di quell'altro blocco di codice in base alle proprie esigenze. Ottieni flessibilità e personalizzazione pur essendo in grado di avere un codice più gestibile.

Meno hardcode = più facile da mantenere e modificare = meno tempo = più valore aziendale = bellezza.

Ad esempio, in JavaScript, usando Underscore.js, puoi trovare tutti gli elementi pari in un array come questo:

var evens = _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
=> [2, 4, 6]

Esempio per gentile concessione di Underscore.js: http://documentcloud.github.com/underscore/#filter


1

[modificato] quando abbiamo due funzioni dire funzioneA e funzioneB , se funzioneA dipende da funzioneB .

allora chiamiamo functionB come funzione di callback. questa è ampiamente usata nel framework Spring.

funzione di callback esempio di Wikipedia


1

Pensa a un metodo come dare un compito a un collega. Un'attività semplice potrebbe essere la seguente:

Solve these equations:
x + 2 = y
2 * x = 3 * y

Il tuo collega fa diligentemente la matematica e ti dà il seguente risultato:

x = -6
y = -4

Ma il tuo collega ha un problema, non capisce sempre le notazioni, ad esempio ^, ma le capisce in base alla loro descrizione. Come exponent. Ogni volta che trova uno di questi ottieni quanto segue:

I don't understand "^"

Ciò richiede che tu riscriva di nuovo l'intero set di istruzioni dopo aver spiegato cosa significa il personaggio per il tuo collega, e non ricorda sempre tra le domande. E ha difficoltà a ricordare anche i tuoi consigli, come chiedermelo. Segue sempre le tue indicazioni scritte nel miglior modo possibile.

Pensi a una soluzione, aggiungi semplicemente quanto segue a tutte le tue istruzioni:

If you have any questions about symbols, call me at extension 1234 and I will tell you its name.

Ora ogni volta che ha un problema ti chiama e ti chiede, piuttosto che darti una risposta negativa e far ripartire il processo.


0

Questo in termini di download di una pagina Web:

Il programma viene eseguito su un cellulare e richiede la pagina Web http://www.google.com . Se si scrive il programma in modo sincrono, la funzione che si scrive per scaricare i dati sarà in esecuzione ininterrottamente fino al download di tutti i dati. Ciò significa che la tua UI non si aggiornerà e apparirà sostanzialmente bloccata. Se scrivi il tuo programma usando i callback, richiedi i dati e dici "esegui questa funzione al termine". Ciò consente all'interfaccia utente di consentire comunque l'interazione dell'utente durante il download del file. Al termine del download della pagina Web, viene richiamata la funzione del risultato (callback) ed è possibile gestire i dati.

Fondamentalmente, ti consente di richiedere qualcosa e continuare l'esecuzione durante l'attesa del risultato. Una volta che il risultato ti viene restituito tramite una funzione di richiamata, puoi riprendere l'operazione da cui era stata interrotta.

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.