In einfachen Worten ... In einfachem Englisch, ist eine Callback-Funktion wie ein Arbeiter, die "ruft zurück" zu sein Manager, wenn er eine Aufgabe abgeschlossen hat.
Wie unterscheiden sie sich vom Aufruf einer Funktion von einer anderen Funktion, die einen Kontext von der aufrufenden Funktion nimmt? Es stimmt, dass Sie eine Funktion von einer anderen Funktion aufrufen, aber der Schlüssel ist, dass der Callback wie ein Objekt behandelt wird. Sie können also die Funktion ändern, die basierend auf dem Systemstatus aufgerufen wird (wie das Strategieentwurfsmuster). .
Wie kann ihre Macht zu einem Anfänger-Programmierer erklärt werden? Die Macht der Rückrufe kann leicht in AJAX-style Websites gesehen werden, die Daten von einem Server abrufen müssen. Das Herunterladen der neuen Daten kann einige Zeit dauern. Ohne Rückrufe würde Ihre gesamte Benutzeroberfläche während des Herunterladens der neuen Daten "einfrieren", oder Sie müssten die gesamte Seite aktualisieren und nicht nur einen Teil davon. Mit einem Callback können Sie ein "jetzt ladendes" Bild einfügen und nach dem Laden durch die neuen Daten ersetzen.
Einiger Code ohne Rückruf:
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)');
}
**With Callback:**
Here is an example with a callback, using jQuery's getJSON:
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
Dies ist ein gutes Beispiel, würde ich folgendes hinzufügen: eine Callback-Methode jede Methode in jeder Klasse sein kann; Ein Verweis auf eine Instanz der Klasse wird in einer anderen Klasse beibehalten, und wenn ein Ereignis in dieser anderen Klasse auftritt, wird die Methode von der ersten Klasse aufgerufen. Das einzige, was es zu einem Callback macht, unterscheidet sich von jedem anderen Methodenaufruf durch die Idee, einen Verweis auf ein Objekt zu übergeben, damit dieses Objekt später auf eine Methode, meist auf ein Ereignis, zugreift. – arcy
Entschuldigung, ich bin neu in Java. Könnte das ohne eine anonyme Klasse gemacht werden? Muss es eine Callback-Schnittstelle sein? Können Sie ein anderes Beispiel angeben, das die Callback-Schnittstelle nicht verwendet, wenn es möglich ist, dies ohne Verwendung dieser Callback-Schnittstelle zu tun? –
@ImtiazAhmad Nein, die anonyme Klasse soll das Beispiel kürzer machen. Sie könnten eine öffentliche Klasse erstellen, die MyCallbackImpl Callback implementiert. –