Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
André Santos

Min Read

23. Februar 2024

So behandeln Sie asynchrone Operationen mit Redux

Es überrascht niemanden, dass JavaScript ist überall.


Hier bei Imaginary Cloud, die meisten Projekte, an denen wir beteiligt sind, verwenden es als Hauptsprache. Mein letztes Projekt war ein ziemlich umfangreicher Antrag, an dem die üblichen Schuldigen beteiligt waren JavaScript-Ökosystem. Wir haben ein React-Frontend und einen Node.js Backend-Stack verwendet.

blue arrow to the left
Imaginary Cloud logo

Warum verwenden wir Redux?

Als wir für dieses Projekt einen Stack definieren mussten, da es viel visuelle Präsentation und 3D-Modellierung beinhaltet, bot sich React in Bezug auf die Frontend-Technologie als eine einfache Wahl an.

Leider war zu dieser Zeit keine klare Strategie für die Staatsverwaltung definiert. Im Zuge der Weiterentwicklung des Projekts wurde es zu einem Problem, weshalb das Team beschloss, die gesamte Logik im Zusammenhang mit der Zustandsverwaltung auf eine Klasse zu migrieren, die sich als Singleton präsentierte. Das würde bei all dem Speicher und den Ereignissen helfen, die mit dem Status zusammenhängen. Kurzfristig war diese Lösung in Ordnung, aber irgendwann würde sie seinen Nutzen übersteigen und es wurde ein Plan in die Wege geleitet, um eine bessere Alternative zu finden. Sie kam in Form von Redux, unterstützt durch die Einführung von Redux-Werkzeugsatz, früher bekannt als Redux Starter Kit.

blue arrow to the left
Imaginary Cloud logo

Was ist ein Redux Store?

Redux ist ein State-Container für JavaScript-Anwendungen, mit dem Sie den natürlichen unidirektionalen React-Datenfluss umgehen können. Das ist möglich, da er über eine Informationsquelle verfügt, die Sie in Ihrer gesamten Anwendung einsehen können, ohne dass Sie als Grundlage für andere Komponenten einen Drilldownstate durchführen müssen. Es ermöglicht Ihnen jedoch auch, mithilfe vordefinierter Aktionen Änderungen vorzunehmen und gleichzeitig eine Historie solcher Aktionen und Mutationen zu führen, die während des Testens abgerufen werden kann.

Wer hat Redux entwickelt?

Als Facebook React der Welt vorstellte, war ihnen bereits klar, wie Requisiten zu einer großen Hürde werden können, wenn sie ein bestimmtes Maß an Komplexität erreichen. Um dieses Problem zu lösen, führten sie neben React ein Konzept namens Flux ein, das beschreibt, wie ein Store in Verbindung mit React funktionieren sollte. Redux basiert, wie wir heute wissen, lediglich auf einem Machbarkeitsnachweis, der von Dan Abramov gehackt wurde, während er an den Flux-Prinzipien für React Europe herumbastelte.

Wo wird Redux verwendet?

Redux wird in großen Anwendungen eingesetzt wo eine Interaktion mit einer Komponente Änderungen auf die gesamte Seite übertragen könnte. Um diese Art der Kommunikation zwischen den Komponenten zu erleichtern, können Sie einfach den Store aufrufen, anstatt Callbacks auf der obersten Ebene der Anwendung erstellen zu müssen. In meinem aktuellen Projekt macht Redux Sinn, weil die Anwendung so weit eskaliert war, dass Requisiten, die sich auf ihren Status bezogen, über mehrere Ebenen von Komponenten weitergegeben wurden, was wiederum das Lesen und Debuggen des Codes erschwerte.

blue arrow to the left
Imaginary Cloud logo

Versenden von asynchronen Aktionen mit Redux

Redux sah aus wie ein Geschenk des Himmels. als wir anfingen, alten Code auf diese neue Funktion zu migrieren. Es hat das gemacht Code sieht schicker aus, es war extrem intuitiv zu verstehen und Die Anzahl der Requisiten, die in der Anwendung herumschwirren, wurde drastisch reduziert. Aber es war nicht perfekt. Die Natur von Reducern stellt ein Problem dar, wenn man das Abrufen von Informationen in ihnen miteinbezieht, und das ist etwas, mit dem sich die Redux-Community schon sehr lange befasst.

Wie man mit asynchronen Aktionen in Redux umgeht

Reduktoren sind laut Dokumentation theoretisch reine Funktionen selbst.

Bei gleichen Argumenten sollte es den nächsten Zustand berechnen und zurückgeben. Keine Überraschungen. Keine Nebenwirkungen. Keine API-Aufrufe. Keine Mutationen. Nur eine Berechnung.

Also, wo solltest du wenden Sie asynchrone Aufrufe in Redux an?


Die Aktionen sollten die unmittelbare Antwort sein, aber die grundlegende Implementierung von Aktionen ist nichts weiter als ein einfaches JavaScript-Objekt, das Sie verwenden, um Informationen an Ihren Shop weiterzuleiten. Aus diesem Grund hat sich die Community mehrere Middlewares ausgedacht, die stattdessen die gesamte Logik in Funktionen zusammenfassen, die das natürliche Verhalten des Shops nachahmen.

Welche Async Redux Middleware sollten Sie wählen?

Wie bei allem in der Programmierung es gibt keine Einheitslösung. Sie sollten also auf jeden Fall recherchieren, welche Middleware am besten zu Ihrem Problem passt. Die erste in der Dokumentation vorgeschlagene Lösung lautet Redux Think. Mit dieser Middleware können Sie Aktionen als mehr als einfache Objekte erstellen. Diese neuen Aktionen können andere Aktionen, andere Thunks und auch asynchrone Operationen ausführen in ihnen. Aber in letzter Zeit haben andere Middleware begonnen, an Bedeutung zu gewinnen, wie Redux-Saga und Redux-Beobachtbar haben unterschiedliche Anwendungsfälle, aber eines haben sie alle gemeinsam, nämlich ein sehr aktives Repositorium und eine blühende Community, die dahinter steht.

Warum Redux Thunk?

Von allen gängigen Lösungen für dieses Problem Redux Think ist am leichtesten zu verstehen. Es ist auch in technischer Hinsicht ziemlich zugänglich und derzeit ist es gemäß der Redux-Dokumentation die empfohlene Methode, um mit dieser Situation umzugehen.

blue arrow to the left
Imaginary Cloud logo

Wie implementiere ich Redux Thunk?

Wir fangen hier an:


Dadurch erhalten Sie eine neue App mit React mit allen Redux-Modulen, die wir für dieses kurze Tutorial benötigt haben. Wir werden auch mit dem arbeiten Woof Bot API-Dienst.

Als Erstes müssen Sie einen Dog Slice einrichten, in dem Sie alle Informationen zu Ihrer Hunde-API-Antwort aufbewahren.

Store Slice

Wir haben unsere Aktionen:

  • Rassen hochladen: Wird als Speicherabdruck für alle Nutzlastinformationen zu den Hunderassen verwendet.
  • Bild der Rasse hochladen: Wird verwendet, um bei Bedarf Bilder bestimmter Rassen hochzuladen.
  • Ladezustand: Wird verwendet, um den Status der Anfrage zu aktualisieren.

und Selektoren:

  • Wählen Sie Rassen: Gibt ein Array aller Rassen zurück, die im Geschäft sind.
  • Wählen Sie ein Zuchtbild: Gibt das Bild für eine bestimmte Rasse zurück.
  • Wird geladen: Gibt den Status der Anfrage zurück

Wie würden Sie das normalerweise mit der API und dem Store hin und her implementieren? Ich würde das alles in eine einbauen useEffect-Haken, ähnlich wie dieser:

useEffect-2

Was machen wir hier?

  1. Komponente ist montiert
  2. Der Ladestatus ist mit einem Versand einer Aktion auf Anfrage gesetzt
  3. Daten werden mit einem einfachen Abruf angefordert
  4. Daten werden von der API empfangen und zu dem gewünschten Objekt verarbeitet
  5. Die Zuchtinformationen im Slice sind auf das eingestellt, was wir mit einem anderen Versand erhalten haben.
  6. Der Ladestatus wird auf Wartend zurückgesetzt

Alternativ erhalten wir möglicherweise eine Fehlermeldung von der API, die den Flow in Schritt 4 stoppt und den Ladestatus auf Fehler setzt.

Das funktioniert und das ist ok. Es hat aber auch mehrere Nachteile. Hauptsächlich bringt es zu viel Logik in die Komponente. Sie ist nicht wiederverwendbar, und wenn Sie woanders auf diese Informationen zugreifen möchten, müssen Sie immer sicherstellen, dass diese Komponente zuerst geladen wird.

Jetzt mit Thunks:

Die Komponentenlogik sieht so aus:

useEffectFinal-2

Wir müssen eine neue FetchBreeds-Aktion erstellen, die der Logik, die wir zuvor in der Komponente hatten, sehr ähnlich sieht:

thunk1-3

Diese einfache Ortsänderung im Code behebt die meisten Probleme, die wir zuvor hatten. Wir haben den Code von der Komponente abstrahiert und diesen speziellen Teil der Logik in der gesamten Codebasis wiederverwendbar gemacht. Diese Informationen sind nicht mehr an das Mounten der Komponente gebunden, sodass Sie jetzt eine neue FetchBreeds-Aktion ausführen können und die Daten werden geladen.

thunk2-2

Dies ermöglicht es uns auch, Thunks zu verketten, falls wir eine kompliziertere Logik in unseren Aktionen benötigen. Wir können auch direkt auf den Bundesstaat zugreifen, anstatt Selektoren zu benötigen. Sie sollten jedoch weiterhin Selektoren verwenden, um sicherzustellen, dass sich Änderungen an Redux nicht auf Ihre Thunks auswirken.

Was soll am Ende ausgewählt werden, um asynchrone Operationen in Redux abzuwickeln?

Hängt von der Situation ab. Genauso wie Sie nicht für alles einen Löffel verwenden können, muss die Lösung auf der Grundlage des Problems ausgewählt werden und nicht umgekehrt.

In den letzten Problemen, mit denen ich konfrontiert war, war Thunks mehr als genug, um alle meine Randfälle zu erfüllen. Aber vielleicht benötigen Sie in Ihrem Fall eine spezifischere Lösung.

Recherchieren Sie, halten Sie sich auf dem Laufenden und Sie haben immer das beste Tool an Ihrer Seite.

Grow your revenue and user engagement by running a UX Audit! - Book a call

Fanden Sie diesen Artikel hilfreich? Diese könnten dir auch gefallen!

blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
André Santos
André Santos

Your everyday web developer who likes to hide in the backend. Javascript and Ruby are my jam. I still fumble with Docker and my builds break quite often.

Read more posts by this author

People who read this post, also found these interesting:

arrow left
arrow to the right
Dropdown caret icon