2016-03-25 8 views
8

Ich bin etwas verwirrt, um den Unterschied zwischen Asynchronen Calls und Callbacks zu verstehen.Was ist der Unterschied zwischen asynchronen Calls und Callbacks

las ich diese Beiträge, die teach about CallBacks aber keine der Antworten Adressen wie es sich von Asynchronous nennt.

Ist dies Rückrufe = Lambda Expressions?

Callbacks laufen in einem anderen Thread?

Kann jemand das mit einfachem Englisch erklären?

+1

eigentlich eine sehr gute Frage. Es macht nichts, wenn die Turd-Gehirne dich abstempeln;) – paulsm4

Antwort

15

Sehr einfach, ein Callback muss nicht asynchron sein.

http://docs.apigee.com/api-baas/asynchronous-vs-synchronous-calls

  1. 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.

  2. 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:

  1. 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").

  2. Ja, Rückrufe können aus einem anderen Thread aufgerufen werden - aber es ist sicherlich keine Voraussetzung.

  3. 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

  1. 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.

  2. 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".

  3. 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.

  4. 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).

  5. 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?

+0

Du synonymisierst "Callback" mit "Asynchronous", was einfach nicht stimmt. Was auch immer diese "Apigee" -Dokumente erwähnen, es ist definitiv nicht sprachunabhängig. Nicht, dass die Frage sprachunabhängig richtig beantwortet werden könnte. Jede Sprache, die ich gesehen habe, hat ihre eigene Art von Callbacks und Asynchronität:/ – Vogel612

+0

Vogel612 - Ich sage ausdrücklich, dass ein Callback NICHT äquivalent zu "asynchron" ist. Ich * AM * sage, dass Sie in Javascript * eine Vielzahl von Callback-Funktionen schreiben werden, und diese Funktionen werden normalerweise asynchron aufgerufen. Daher die Notwendigkeit für "Versprechen" in Javascript. – paulsm4

+0

@ paulsm4 Können Sie bitte mit einem Beispiel erläutern, wie der Rückruf und der asynchrone Aufruf im Ausführungsfluss funktioniert? ** Das wird sehr hilfreich sein ** –

0

Sie sind sehr ähnlich, aber das ist nur mho.

Wenn Sie Rückrufe verwenden, geben Sie an, auf welche Methode Sie zurückgerufen werden sollten, und Sie verlassen sich auf die Methoden, die Sie anrufen, um Sie zurückzurufen. Sie können Ihren Rückruf so festlegen, dass er überall ankommt und Sie nicht garantiert zurückgerufen werden.

Bei der asynchronen Programmierung sollte sich der Aufrufstapel wie bei der normalen synchronen Programmierung in die Startposition abwickeln.

Vorbehalt: Ich denke speziell an die C# erwarten Funktionalität, da es andere Async-Techniken gibt.

+0

Würdest du gerne erklären, warum du das für nötig gehalten hast? – user1763100

+0

hier ist ein upvote;) – paulsm4

Verwandte Themen