Node.js / Async - Wie vermeidet man Callback-Hölle mit Async?

8

Ich bin neu in Node.Js und JavaScript Web-Entwicklung auf dem Backend. Ich sehe, dass Rückrufe innerhalb von Rückrufen ein Schmerz sein können und es Module gibt, die das vermeiden. Eines dieser Module ist async, Ссылка

Ich habe die Dokumentation gelesen, aber es ist schwer zu beginnen und zu verstehen, wie es geht.

Zum Beispiel habe ich diese Funktion "check_aut_user", Wie kann ich diesen Code mit async konvertieren?

%Vor%

Beste Grüße,

    
André 07.01.2014, 00:32
quelle

3 Antworten

4

Aus meiner Sicht ist Callback-Hölle wirklich eine Mischung aus zwei Problemen:

  • Anonyme Inline-Funktionen.
  • Einrückung.

Entweder in kleinen Mengen ist in Ordnung, aber zusammen machen sie Code starr und nicht wartbar. Die Lösung zur Vermeidung der Callback-Hölle besteht darin, diese beiden Dinge zu vermeiden:

  • Benennen Sie Ihre Funktionen und entfernen Sie sie aus Funktionsaufrufen.
  • Frühzeitige Rückkehr, um die Absicht zu vermeiden.

Nach diesen Prinzipien kann Ihr Code wie folgt umgeschrieben werden:

%Vor%

Ich habe async.auto hier verwendet, auch wenn async.waterfall dies tun würde. Der Grund dafür ist, dass es schwierig ist, Schritte in waterfall zu verschieben, hinzuzufügen oder zu entfernen, und das war eine Fehlerquelle. Mit auto können Sie Schritte hinzufügen, ohne sich Sorgen zu machen, und die Reihenfolge / Parallelität wird asynchron gehandhabt.

Das verwendet offensichtlich viel mehr vertikalen Platz, aber ich denke, das ist ein kleiner Preis für die Modularität.

    
qubyte 01.03.2014 01:22
quelle
4

Es gibt verschiedene Möglichkeiten, die außer Kontrolle geratene Verschachtelung mit funktionalen Programmiertechniken zu bekämpfen. Ich verwende das Modul curry , um Schleifenkörper in eigenständige Routinen zu zerlegen. in der Regel hat dies einen sehr geringen Leistungseinbruch gegenüber der Verschachtelung (Studie curry für warum). Beispiel:

%Vor%

Anstelle von:

%Vor%

Das zweite Beispiel ist kompakter, aber je mehr Verschachtelung Sie hinzufügen, desto weniger lesbar wird es. Durch Aufteilen der Implementierung können Sie Komponentenfunktionen auf verschiedene Arten wiederverwenden. Außerdem können Sie Einheitentests für die einzelnen Komponentenfunktionen schreiben, nicht nur für die Funktionen auf hoher Ebene.

    
wberry 28.02.2014 19:30
quelle
0

Hier ist der Code geändert, um Async wann immer erforderlich zu verwenden.

%Vor%

Offensichtlich macht es den Code nicht lesbarer. Ich würde zusätzliche Änderungen vorschlagen:

  • Das Abfragen der Datenbank sollte in einer eigenen Methode getrennt werden (es ist in der Tat eine Modellmethode), was eine Fehlerprüfung in einer eigenen "Domäne" ermöglicht.
  • Passport-Serialisierung / Deserialisierung sollte aus denselben Gründen in einer separaten Methode durchgeführt werden.

Diese beiden Methoden würden beide Callbacks annehmen. Hier ist ein Umschreiben:

%Vor%

Somit wird unsere Hauptmethode nun:

%Vor%

Ich hoffe, Sie können sehen, dass dies viel viel besser ist.

    
verybadalloc 07.01.2014 01:20
quelle

Tags und Links