Was ist die "callback-Hölle" und wie und warum tut RX es lösen?
Kann jemand eine klare definition zusammen mit einem einfachen Beispiel erklärt, was ein "callback-Hölle" für jemanden, der nicht weiß, JavaScript und node.js ?
Wann (in welcher Art von Einstellungen) ist die "callback-Hölle-problem" auftreten?
Warum tritt es auf?
Ist "callback-Hölle", beziehen sich immer auf asynchrone Berechnungen?
Können oder "callback-Hölle" kommen auch in einem single-threaded-Anwendung?
Nahm ich die Reaktive Kurs bei Coursera und Erik Meijer sagte in einem seiner Vorträge, dass RX löst das problem der "callback-Hölle". Ich fragte, was ist ein "callback-Hölle" auf der Coursera-forum, aber ich bekam keine klare Antwort.
Erklärt und nach "callback-Hölle" auf ein einfaches Beispiel, könnte dir auch zeigen, wie RX löst die "callback-Hölle-problem" auf, dass einfaches Beispiel?
Du musst angemeldet sein, um einen Kommentar abzugeben.
1) Was ist ein "callback-Hölle" für jemanden, der nicht weiß, javascript und node.js ?
Diese andere Frage hat einige Beispiele von Javascript-callback-Hölle: Wie vermeiden Sie lange verschachtelte asynchrone Funktionen in Node.js
Das problem in Javascript ist, dass der einzige Weg, um "einfrieren" eine Berechnungs-und haben den "rest" ausführen letzteren (asynchron) zu legen, um "den rest" innerhalb einer callback.
Beispielsweise sagen, ich möchte code ausführen, der wie folgt aussieht:
Was passiert, wenn ich jetzt wollen die getData-Funktionen asynchron, was bedeutet, dass ich die chance bekommen, einige andere code, während ich warten, bis Sie zurückkehren, Ihre Werte? In Javascript, der einzige Weg wäre, um zu umschreiben, dass alles, was Sie berührt eine asynchrone Berechnung mit continuation-passing-style:
Glaube ich nicht, ich muss niemanden überzeugen, dass diese version ist hässlicher als die Vorherige. 🙂
2) Wann (in welcher Art von Einstellungen) ist die "callback-Hölle-problem" auftreten?
Wenn Sie haben viele von callback-Funktionen in Ihrem code! Es wird immer schwieriger, mit Ihnen zu arbeiten, die mehr von Ihnen, die Sie in Ihrem code und es wird besonders schlimm, wenn Sie brauchen, um do-Schleifen, try-catch-Blöcke und Dinge wie, dass.
Zum Beispiel, soweit ich weiß, in JavaScript die einzige Möglichkeit zum ausführen einer Reihe von asynchronen Funktionen, bei denen eine ausgeführt wird, nachdem die vorherigen zurückkehrt, ist mit einer rekursiven Funktion. Sie können nicht verwenden Sie eine for-Schleife.
Statt, möglicherweise müssen wir am Ende schreiben:
Die Anzahl der Fragen, die wir bekommen hier auf StackOverflow zu Fragen, wie das zu tun diese Art der Sache ist ein Beweis dafür, wie verwirrend es ist 🙂
3) Warum tritt es auf ?
Es tritt auf, da in JavaScript die einzige Möglichkeit, zu verzögern, eine Berechnung, so dass es ausgeführt wird, nachdem der asynchrone Aufruf zurückgegeben wird, ist der verzögerte code innerhalb einer callback-Funktion. Sie können keine Verzögerung code, der geschrieben wurde in der traditionellen synchronen Stil, so dass Sie am Ende mit verschachtelten callbacks überall.
4) Oder "callback-Hölle" kommen auch in einem single-threaded-Anwendung?
Asynchrone Programmierung zu tun hat mit der Parallelität während eine single-thread zu tun hat mit der Parallelität. Die beiden Begriffe sind eigentlich nicht das gleiche.
Können Sie noch gleichzeitigen code in einem single-threaded-Kontext. In der Tat, JavaScript, die Königin der callback-Hölle, ist single threaded.
Was ist der Unterschied zwischen Gleichzeitigkeit und Parallelität?
5) können Sie bitte auch zeigen, wie RX löst die "callback-Hölle-problem" auf, dass einfaches Beispiel.
Ich weiß nichts über die RX in allem, aber in der Regel dieses problem wird gelöst durch das hinzufügen von native support für die asynchrone Berechnung in der Programmiersprache. Die Implementierungen können variieren und umfassen: async, Generatoren, Coroutinen, und callcc.
In Python, die wir umsetzen können, der vorherigen Schleife zum Beispiel mit etwas entlang der Linien von:
Dies ist nicht der vollständige code, sondern die Idee ist, dass die "Ausbeute" hält unsere for-Schleife, bis jemand fordert, myGen.next(). Das wichtigste ist, dass wir noch den code schreiben, der mittels einer for-Schleife ohne sich zu drehen Logik "inside out", wie wir zu tun hatten, dass rekursive
loop
Funktion.Beantworten Sie einfach die Frage: können Sie bitte auch zeigen, wie RX löst die "callback-Hölle-problem" auf, dass einfaches Beispiel?
Die Magie ist
flatMap
. Wir können schreiben Sie den folgenden code in Rx für @hugomg Beispiel:Es ist wie Sie schreiben einige synchron-FP-codes, aber tatsächlich kann Sie asynchron
Scheduler
.Adresse der Frage, wie Rx löst callback-Hölle:
Lassen Sie uns zuerst beschreiben, callback-Hölle wieder.
Sich vorstellen, ein Fall wurden wir tun müssen http, um drei Ressourcen - Personen, planet und Galaxie. Unser Ziel ist es, die Galaxie, die person lebt in. Zuerst muss man die person, dann die Planeten, dann die Galaxie. Drei Rückrufe für drei asynchrone Operationen.
Jeden Rückruf geschachtelt ist. Jede innere callback ist abhängig von seinen Eltern. Dies führt zu der "pyramid of doom" - Stil der callback-Hölle. Der code sieht aus wie ein > sign.
Lösen diese in RxJs könnten Sie etwas wie das tun:
Mit der
mergeMap
AKAflatMap
Betreiber könnte man es kurz und bündig:Wie Sie sehen können, der code ist abgeflacht und enthält eine einzige Kette von Methodenaufrufen. Wir haben keine "pyramid of doom".
Daher, callback-Hölle vermieden wird.
Falls Sie sich Fragen, verspricht sind ein weiterer Weg, um zu vermeiden, callback-Hölle, aber die Versprechen eifrig, nicht faul wie observablen und (im Allgemeinen) Sie nicht Abbrechen kann Ihnen so leicht.
Callback-Hölle ist, jeden code, wobei das verwenden der Funktion Rückrufe im async-code unklar oder schwer zu Folgen. Im Allgemeinen, wenn es mehr als eine Ebene der Dereferenzierung code Rückrufe verwenden können, werden schwieriger zu Folgen, schwieriger zu überarbeiten, und schwerer zu testen. Ein code smell ist in mehreren Ebenen der Einrückung durch die übergabe mehrerer Schichten von funktionsliterale.
Dies geschieht oft, wenn ein Verhalten hat Abhängigkeiten, d.h. wenn Ein geschehen muss vor B geschehen muss, bevor C. Dann erhalten Sie einen code wie diesen:
Wenn man viele Verhaltens-Abhängigkeiten in Ihrem code wie folgt, es kann lästig fallen. Vor allem, wenn es Filialen...
Dies nicht tun. Wie können wir den asynchronen code ausführen in einer bestimmten Reihenfolge, ohne pass alle diese Rückrufe herum?
RX ist die Abkürzung für 'reactive extensions'. Ich habe nicht verwendet, aber Googeln legt nahe, es ist ein event-basiertes framework, das macht Sinn. Veranstaltungen sind ein gemeinsames Muster sein kann, um code auszuführen, um ohne Erstellung spröde Kupplung. Sie können C hören Sie das Ereignis 'bFinished', was nur passiert, wenn B aufgerufen wird, hören 'avollendete'. Sie können dann einfach fügen Sie zusätzliche Schritte oder verlängern diese Art von Verhalten, und kann einfach testen, dass der code ausgeführt wird, um allein durch die Ausstrahlung von Veranstaltungen in den test-Fall.
Wenn Sie nicht über ein wissen über Callbacks und callback-Hölle gibt es kein problem.Tritt der Sache ist, dass call back-und call-back-Hölle.Zum Beispiel:die Hölle zurück rufen ist wie ein können wir speichern eine Klasse in einer Klasse.Als Sie hörte, eingebettet in C, C++ - Sprache.Verschachtelt Bedeutet, dass eine Klasse in einer anderen Klasse.
Verwenden jazz.js
https://github.com/Javanile/Jazz.js
es vereinfacht so: