Verwalten von Abhängigkeitsanforderungen

8

Ich benutze Node.js und Bluebird, um eine ziemlich komplizierte Logik zu erstellen, die das Dekomprimieren einer strukturierten Datei, das Analysieren von JSON, das Erstellen und Ändern von mehreren MongoDB-Dokumenten und das Schreiben verwandter Dateien an verschiedenen Orten beinhaltet. Ich habe auch ziemlich komplizierte Fehlerbehandlung für alle diese abhängig von dem Zustand des Systems, wenn ein Fehler auftritt.

Ich habe Schwierigkeiten, über eine gute Möglichkeit nachzudenken, Abhängigkeiten durch den Fluss von Versprechen zu verwalten.

Mein bestehender Code sieht im Prinzip so aus:

%Vor%

Beachten Sie, dass dependency1 erst ab promise3 benötigt wird und dass der Error-Handler über die Abhängigkeiten Bescheid wissen muss.

Für mich scheint das wie Spaghetti-Code (und mein tatsächlicher Code ist viel schlechter mit viel parallelem Kontrollfluss). Ich habe auch gelesen, dass das Zurückgeben eines anderen Versprechens innerhalb eines Callbacks ein Antipattern ist. Gibt es einen besseren / saubereren Weg, um das zu erreichen, was ich versuche?

    
Tom O'Connell 22.01.2015, 02:17
quelle

3 Antworten

9

Ich finde beide Antworten derzeit nett, aber ungeschickt. Sie sind beide gut, aber enthalten Overhead, ich glaube nicht, dass du es haben musst. Wenn Sie stattdessen Versprechen als Proxies verwenden, erhalten Sie viele Dinge kostenlos.

%Vor%

Bitte verwenden Sie nicht successFunction und so ist es ein Anti-Muster und verliert Informationen.  Wenn Sie successFunction verwenden möchten, können Sie schreiben:

%Vor%

Es ist jedoch unendlich schlechter, da es dem Verbraucher nicht erlauben wird, mit Fehlern umzugehen, die er verarbeiten kann.

    
Benjamin Gruenbaum 22.01.2015, 08:18
quelle
1

Diese Frage ist möglicherweise besser für code review geeignet, aber hier ist, wie ich es in diesem Beispiel angehen würde:

> %Vor%

Die Verwendung von allResolved ist nur aufgrund Ihrer Callback-Besonderheiten möglich. Wenn Sie einen allgemeineren Fehlerhandler hätten, könnten Sie einfach Promise.all direkt oder sogar:

auflösen %Vor%     
loganfsmyth 22.01.2015 02:56
quelle
1

Es ist sicherlich kein Antipattern, um Versprechungen innerhalb von then s zurückzugeben, die Verflachung verschachtelter Versprechen ist ein Merkmal der Versprechensspezifikation.

Hier ist eine mögliche Neuschreibung, obwohl ich mir nicht sicher bin, ob es sauberer ist:

%Vor%

Oder eine andere Option mit atomaren Aufräumfunktionen:

%Vor%

Wirklich, ich habe das Gefühl, dass es nicht viel gibt, was du tun kannst, um das aufzuräumen. Event mit vanilla try/catch es, das bestmögliche Muster ist diesen sehr ähnlich.

    
bcherny 22.01.2015 03:07
quelle