Sehr einfach, ein Callback muss nicht asynchron sein.
http://docs.apigee.com/api-baas/asynchronous-vs-synchronous-calls
Synchron:
Wenn ein API-Aufruf synchron ist, bedeutet es, dass die Codeausführung wird Block (oder warten) für den API-Aufruf vor dem Fortfahren zurückzukehren. Diese bedeutet, dass Ihre Anwendung keine weitere Ausführung ausführt, bis die Antwort von der API zurückgegeben wird, die vom Benutzer als Latenz oder Leistungsverzögerung in Ihrer App wahrgenommen werden könnte. Ein API-Aufruf synchron kann jedoch von Vorteil sein, wenn es Code in Ihrer App gibt, die nur ordnungsgemäß ausgeführt wird, sobald die API-Antwort empfangen wird.
Asynchron:
Asynchronous Anrufe nicht blockieren (oder warten) für den API-Aufruf vom Server zurückzukehren. Die Ausführung wird in Ihrem Programm fortgesetzt, und wenn der Aufruf vom Server zurückkehrt, wird eine "Callback" -Funktion ausgeführt.
in Java, C und C#, "Rückrufe" sind in der Regel synchron (in Bezug auf eine "Hauptereignisschleife"). In Callbacks sind in der Regel asynchrone - übergeben Sie eine Funktion, die aufgerufen wird ... aber andere Ereignisse werden weiter verarbeitet, bis der Rückruf aufgerufen wird.
Wenn es Ihnen egal ist, welche Javascript-Ereignisse in welcher Reihenfolge auftreten - großartig. Ansonsten ist ein sehr leistungsfähiger Mechanismus für die Verwaltung von asynchronem Verhalten in Javascript zu "Versprechen" zu verwenden:
http://www.html5rocks.com/en/tutorials/es6/promises/
PS: Ihre weiteren Fragen zu beantworten:
Ja, kann ein Rückruf sein ein Lambda - aber es ist keine Voraussetzung.
In Javascript wird fast jeder Callback eine "anonyme Funktion" sein (im Grunde ein "Lambda-Ausdruck").
Ja, Rückrufe können aus einem anderen Thread aufgerufen werden - aber es ist sicherlich keine Voraussetzung.
Rückrufe können auch (und oft tun) spawn ein Thread (wodurch sich selbst "asynchron").
‚Hoffnung, die
hilft =================================== =================================
Hallo, nochmal:
Q: @ paulsm4 kannst du bitte anhand eines Beispiels erläutern, wie der Callback und der asynchrone Aufruf im Ablauf funktioniert? Das wird sehr hilfreich
Zuerst haben wir für „Rückruf“ auf eine Definition einigen müssen. Hier ist eine gute:
https://en.wikipedia.org/wiki/Callback_%28computer_programming%29
In der Computerprogrammierung, ein Rückruf um einen ausführbaren Code ist, dass als Argument für einen anderen Code übergeben wird, die zurück nennen erwartet wird (execute) das Argument zu einem passenden Zeitpunkt. Der Aufruf kann sofort wie in einem synchronen Rückruf sein, oder es könnte zu einem späteren Zeitpunkt wie in einem asynchronen Rückruf passieren.
Wir müssen auch "synchron" und "asynchron" definieren. Grundsätzlich - wenn ein Callback seine ganze Arbeit macht, bevor er zum Aufrufer zurückkehrt, ist es "synchron". Wenn es unmittelbar nach dem Aufruf an den Aufrufer zurückgegeben werden kann und der Aufrufer und der Rückruf parallel arbeiten können, ist es "asynchron".
Das Problem mit synchronen Rückrufen ist, dass sie scheinbar "hängen". Das Problem mit asynchronen Rückrufen besteht darin, dass Sie die Kontrolle über die "Bestellung" verlieren können - Sie können nicht unbedingt garantieren, dass "A" vor "B" auftritt.
Gängige Beispiele für Rückrufe sind:
a) eine Taste drücken Handler (jeweils verschiedene "Taste" wird eine andere "Antwort") haben. Diese werden normalerweise als "asynchrony" (durch die Hauptereignisschleife der GUI) aufgerufen.
b) eine Art "vergleichen" -Funktion (so eine gemeinsame "sort()" -Funktion kann verschiedene Datentypen behandeln). Diese werden normalerweise "synchron" aufgerufen (direkt von Ihrem Programm aufgerufen).
ein konkretes Beispiel:
a) Ich habe ein "C" -Sprache Programm mit einer "print()" Funktion.
b) "print()" wurde entwickelt, um einen von drei Rückrufen zu verwenden: "PrintHP()", "PrintCanon()" und "PrintPDF()".
c) "PrintPDF()" ruft eine Bibliothek auf, um meine Daten in PDF zu rendern. Es ist synchron - das Programm kehrt nicht von "print()" zurück, bis das PDF-Rendering abgeschlossen ist. Es geht normalerweise ziemlich schnell, also gibt es kein Problem.
d) Ich habe "PrintHP()" und "PrintCanon()" codiert, um Threads zu erzeugen, um die I/O zum physischen Drucker zu machen. "Print()" wird beendet, sobald der Thread erstellt wurde. Das eigentliche "Drucken" läuft parallel zur Programmausführung ab. Diese beiden Rückrufe sind "asynchron".
Frage: Sinn machen? Hilft das?
eigentlich eine sehr gute Frage. Es macht nichts, wenn die Turd-Gehirne dich abstempeln;) – paulsm4