Warnung
Installieren Sie dieses Paket nicht als Abhängigkeit! (Siehe: Erste Schritte)
Derzeit sind Versprechen die de-facto-Art, asynchrone Aufgaben in JavaScript zu bewältigen, und aus diesem Grund sind sie ein grundlegender Bestandteil des Wissens eines JavaScript-Entwicklers.
Wenn wir jedoch zum ersten Mal Versprechen lernen, lernen wir nur genug, um durchzukommen , das heißt, wir lernen ein wenig, wie man Versprechungen verwendet (heutzutage, höchstwahrscheinlich nur mit async/await ) die Promise.all Methode und das ist es.
Obwohl dieser Ansatz für Anfänger sinnvoll ist, weil es ausreicht, die meisten Probleme in ihrem täglichen Leben zu lösen, ist ein wiederkehrendes Problem, dass sie dort aufhören , das heißt, sie gehen nie an diesem ersten Wissen vorbei.
Und genau diese "lernen Sie gerade genug, um durch die Haltung zu gelangen, die viele Entwickler auf ihrem aktuellen Niveau hält, da die Lösung komplexerer Probleme ein tieferes Verständnis erfordert.
Wenn Sie also Ihre Entwicklerfähigkeiten auf das nächste Level bringen möchten, müssen Sie in async/await Wasser nicht eingehen , Sie then/catch die Versprechungen vollständig verstehen und wie sie funktionieren.
Da Versprechen letztendlich eine Abstraktion sind, um asynchrone Aufgaben zu behandeln, ist es ein Muss, häufige Probleme im Zusammenhang mit asynchroner Programmierung anzugehen.
In diesem Sinne haben wir dieses Projekt genau erstellt, um Ihnen dabei zu helfen, diesen tiefen Eintauchen in Versprechungen und asynchrone Programme zu machen.
Durch die Bereitstellung von Erklärungen und praktischen Übungen, die diese Themen umgeben, zielt dieses Projekt darauf ab, Ihr Begleiter auf dieser Reise zu sein, um sie zu meistern.
Selbst wenn Sie bereits ein erfahrener Entwickler sind, lernen Sie möglicherweise ein oder zwei Dinge, wie zum Beispiel, dass Sie versuchen möchten, concrete/parallelMaxConcurrency , concrete/concurrencyOverride , concrete/extractingResolvers und /foundation/promise zu lösen, da sie einige interessante Herausforderungen darstellen.
Wichtig
Dieses Projekt ist nicht für Menschen gedacht, die zum ersten Mal Versprechen lernen, da es vorausgesetzt wird, dass Sie zumindest einige Grundkenntnisse über Versprechungen haben, was sie repräsentieren und wie sie beide mit async/await und then/catch können.
Warnung
Achtung: Dieses Repo soll nicht geklont werden, es sei denn, Sie beitragen, wenn Sie ein Endbenutzer sind, befolgen
Um das Projekt zu installieren, rennen Sie zunächst:
npm create promises-training@latestNotiz
Dieses Projekt ist trainieren, daher ist das Hauptziel, sie zu lösen.
Gelegentlich gibt es Erklärungen sowie die Übungen, die Ihnen helfen, zu verstehen, was getan werden muss, und auch einen Kontext über das Problem, das gelöst wird.
Übungen sind in drei Kategorien unterteilt:
Wichtig
Es gibt keine bestimmte Reihenfolge für Kategorien. Sie können von ihnen von ihnen aus starten und zu einem anderen wechseln, bevor Sie den anderen vollständig beenden. Die Übungen haben jedoch unterschiedliche Ebenen, die als nächstes diskutiert werden.
Die Übungen befinden sich innerhalb von src/exercises/<category> Ordnern, wobei <category> eine der oben genannten Kategorien ist.
Für Grafikübungen befinden sich die Grunderklärungen in diesem Readme, im Abschnitt Graph, und für jede Übung gibt es ein graph.png .
Für konkrete und fundamentale Übungen befinden sich die Erklärungen in der README.md im Ordner der Übung (z. B. src/exercises/concrete/parallelChunks/README.md ).
Um eine Übung zu lösen, müssen Sie die Datei src/exercises/<category>/<exercise>/exercise.ts bearbeiten.
Nach der Lösung einer Übung können Sie Ihre Lösung durch Ausführen überprüfen:
npm run check < category > / < exercise > Die Tests befinden sich innerhalb von src/tests .
Im Allgemeinen arbeiten Sie nur im Ordner des Übungen, da die Tests so entwickelt werden, dass sie Ihnen genau sagen, was schief gelaufen ist, ohne sich ihre Implementierung anzusehen. Wenn Sie jedoch aus irgendeinem Grund stecken oder neugierig bleiben, können Sie sie ansehen.
Der src/lib -Ordner ist nur für den internen Gebrauch vorgesehen. Machen Sie sich also nicht darum.
Um Ihre Installationsweiterungen mit zukünftigen Versionen kompatibel zu halten, ändern Sie keine Datei außerhalb des Ordners src/exercises .
Neben Kategorien sind Übungen auch in Stufen unterteilt, in denen die Übungen beim Durchlaufen der Ebenen den Schwierigkeitsgrad zunehmen.
Es gibt drei Ebenen:
Denken Sie daran, dass diese Klassifizierung etwas subjektiv ist, also ymmv und Sie müssen nicht unbedingt alle Übungen auf einem Niveau abschließen, um zum nächsten zu wechseln.
Notiz
Wie Sie sehen können, gibt es derzeit nicht so viele erweiterte Übungen, aber die Idee ist, dass im Laufe der Zeit neue Übungen hinzugefügt werden.
Jede Übung wird von automatisierten Tests begleitet, damit Sie Ihre Lösung überprüfen können.
Um die Tests einer einzelnen Übung durchzuführen, rennen Sie:
npm run check < category > / < exercise > Um beispielsweise die Tests für die parallelChunks -Übung durchzuführen, rennen Sie:
npm run check concrete/parallelChunksOder um die Grafik -Übungsnummer 2 auszuführen, laufen Sie aus:
npm run check graph/2/test.test.tsNotiz
Im vorherigen Beispiel mussten wir /test.test.ts an die Datei der Übung anhängen, da sonst auch andere Grafikübungen ab 2 , zum Beispiel: Übungen von 2 bis 29.
Wir verwenden Vitest als Testläufer, sodass alle CLI -Optionen verfügbar sind.
Es ist auch wichtig zu erwähnen, dass Diagrammübungen einige Besonderheiten in dem Sinne haben, dass sie automatisch aus der Grafik selbst generiert werden . Aus diesem Grund haben einige Übungen eine große Anzahl von Tests (einige Übungen haben über 100.000 Tests).
Natürlich laufen wir nicht alle, da es unerschwinglich langsam wäre, also führen wir nur eine Teilmenge von ihnen durch und es ist möglich, die Anzahl der durchgeführten Tests und auch die Teilmenge zu optimieren.
Sie können mehr im Abschnitt Diagrammübungen lesen.
Derzeit gibt es drei Übungskategorien:
Ein großer Teil des Umgangs mit asynchronen Aufgaben besteht darin, sie so schnell wie möglich zu orchestrieren, und um diese Aufgaben ordnungsgemäß zu organisieren, müssen wir die Abhängigkeitsbeziehungen zwischen ihnen verstehen.
In dieser Kategorie werden in jeder Übung ein Abhängigkeitsgraphen angezeigt und dann die Aufgaben im Diagramm auf die effizienteste Weise orchestrieren.
Da sich die Übung auf die Orchestrierung selbst konzentriert, werden Aufgaben durch das Aufrufen createPromise(label) erstellt, wobei label eine Zeichenfolge ist, die die Aufgabe identifiziert.
Nehmen Sie zum Beispiel diese Grafik:

In diesem Diagramm gibt es zwei Aufgaben, A und B , und B hängt von A ab, was durch den Pfeil dargestellt wird, der aus B hervorgeht und auf A zeigt.
Dies bedeutet, dass B erst nach Abschluss A beginnen kann und A , da es nicht von einer anderen Aufgabe abhängt, sofort beginnen kann.
Die effizienteste Implementierung für diese Grafik wäre daher:
await createPromise ( "A" ) ;
await createPromise ( "B" ) ;Aufgaben können auch von mehr als einer Aufgabe abhängen:

In diesem Diagramm hängt C sowohl von A als auch B ab, sodass es erst nach Abschluss von A und B beginnen kann.
Sowohl A als auch B hängen jedoch nicht von einer anderen Aufgabe ab, sodass sie sofort beginnen können.
Die effizienteste Implementierung für diese Grafik wäre:
await Promise . all ( [ createPromise ( "A" ) , createPromise ( "B" ) ] ) ;
await createPromise ( "C" ) ;Aufgaben können auch mehrere verschiedene Sätze von Abhängigkeiten haben, bei denen die Aufgabe starten kann, wenn eines der Sets erfüllt ist:

In diesem Diagramm hängt C entweder von A oder B ab, das durch die Verwendung verschiedener Farben für jeden Abhängigkeitssatz dargestellt wird. Die Farben selbst haben keine spezifische Bedeutung, sie werden so verwendet, nur, damit die Abhängigkeiten voneinander unterschieden werden.
Daher kann C sobald A oder B fertiggestellt werden.
await Promise . any ( [ createPromise ( "A" ) , createPromise ( "B" ) ] ) ;
await createPromise ( "C" ) ;Last but not least haben Versprechen zwei mögliche Ergebnisse: Sie können entweder erfüllt oder abgelehnt werden.

In dieser Grafik haben wir Aufgabe B , die von der Erfüllung und C von A abhängt, die von A Ablehnung abhängt.
Wichtig
Gestrichelte Kanten werden verwendet, um Versprechenablehnungen darzustellen.
Dies bedeutet, dass B erst beginnen kann, nachdem A erfüllt wurde und C erst beginnen kann, nachdem A abgelehnt wurde.
Da nur eines dieser Ergebnisse möglich ist, wird entweder B oder C durchgeführt.
Entsprechende Implementierung:
try {
await createPromise ( "A" ) ;
try {
await createPromise ( "B" ) ;
} catch { }
} catch {
await createPromise ( "C" ) ;
} Wenn Sie Grafikübungen durchführen, werden Sie feststellen, dass drei Funktionen exportiert werden: mixed , asyncAwait , thenCatch .
Die Idee ist, dass Sie 3 verschiedene Implementierungen bereitstellen:
mixed : Dieser ist völlig kostenlos, Sie können sowohl asynchronisiert/warten als auch dann/fangen,asyncAwait : In diesem Fall sollten Sie nur Async/Warten verwendenthenCatch : In diesem Fall sollten Sie nur dann/fangen.Auf diese Weise werden Sie beide Arten des Versprechens umgehen.
Am Ende der Datei werden Sie auch feststellen, dass die Exporte in einen skipExercise eingewickelt werden, der Tests für diese spezifische Implementierung überholt, damit sie die Ausgabe nicht verfällt.
Wenn Sie für jede dieser drei eine Lösung implementieren, entfernen Sie den Aufruf skipExercise für die Implementierung, die die Tests ausführen sollen. Zum Beispiel: Wenn Sie die mixed Lösung bereits implementiert haben, entfernen Sie die skipExercise aus, behalten Sie jedoch die für asyncAwait und thenCatch bis Sie sie implementieren.
Um Ihnen beim Debuggen Ihrer Implementierung für die Grafikübungen zu helfen, haben wir eine Benutzeroberfläche erstellt, mit der Sie verschiedene "Pfade" der Ausführung simulieren können.
Um die Benutzeroberfläche zu öffnen, rennen Sie:
npm run graph:uiDie Benutzeroberfläche wird als Web -App serviert und sieht so aus.

Lassen Sie uns nun jeden Abschnitt untersuchen:

In der Seitenleiste links können Sie die Übung auswählen, die Sie debuggen möchten.

In diesem oberen Abschnitt können Sie die Implementierung auswählen, die Sie debuggen möchten.

Mit der rechten Seitenleiste können Sie den Ausführungsfluss der Übung durch Lösen/Ablehnen von Versprechen steuern.
Wenn Versprechungen erstellt werden, werden der Seitenleiste neue Einträge hinzugefügt.

Dieser Abschnitt in der Mitte zeigt die Aufzeichnungen der Versprechen, die in jedem Schritt erstellt und gelöst/abgelehnt wurden.

Dieser Abschnitt unten zeigt eine Zusammenfassung der Versprechen, die bei jedem Schritt gelöst/abgelehnt wurden.
Da Diagrammübungen auf Diagramme (DUH) basieren, können alle möglichen Tests für eine bestimmte Übung automatisch generiert werden, was wir tun.
Wie man sich vorstellen kann, ist die Anzahl der generierten Tests manchmal riesig, sodass wir eine Obergrenze für die maximale Anzahl von Tests haben, die durchgeführt werden.
Um Vorurteile zu verhindern, führen wir auch keine Tests in der Reihenfolge durch, in der sie erzeugt wurden, stattdessen mischen wir sie.
Dieses Mischen erfolgt gleich nach dem ersten Erstellen der Tests, sodass Tests deterministisch sind, dh jedes Mal, wenn Sie Diagrammübungen Tests ausführen, werden Sie dieselbe Untergruppe von Tests ausführen.
Es ist jedoch möglich, sowohl die Kappe als auch die Teilmenge der durchgeführten Tests zu optimieren .
Um die Kappe zu optimieren, können Sie npm run graph:setGraphTestsCap <number> .
Um die Kappe auf 10000 zu setzen, rennen Sie beispielsweise:
npm run graph:setGraphTestsCap 10000 Um die Teilmenge der ausgeführten Tests zu optimieren, können Sie npm run graph:shuffleGraphTestData <graph-exercise-number> , mit der die Tests für die angegebene Graphenübung umgestaltet werden, die dann zu einer anderen Teilmenge von Tests führt.
Um die Tests für Graph -Übungsnummer 2 zu formen, leiten Sie beispielsweise um:
npm run graph:shuffleGraphTestData 2Diagrammübungen eignen sich hervorragend zum Verständnis der Abhängigkeitsbeziehungen zwischen Aufgaben. Sie decken jedoch nicht das gesamte Spektrum möglicher Szenarien ab, da nur Aufgaben, deren Abhängigkeiten zur Kompilierungszeit bekannt sind und festgelegt sind, durch ein Diagramm dargestellt werden können.
Daher haben wir diese Kategorie konkreter Übungen, in denen Sie konkrete Szenarien präsentiert werden, die Sie implementieren müssen.
Da jede Übung in dieser Kategorie eindeutig ist, wird ihre Beschreibung mit ihrem Ordner koloziiert.
Fundamentübungen sollen Ihnen helfen, Ihr Verständnis für die Grundlagen von Versprechen zu verstärken, indem Sie versprechensbezogene Funktionen und schließlich das Versprechen selbst neu einstellen.
Beschreibungen werden mit Übungen koloziiert.
Lösungen für die Übungen finden Sie in diesem Repo, z.
Wir empfehlen jedoch, dass Sie die Lösungen nur überprüfen, nachdem Sie die Übung selbst gelöst haben, da das Ziel für Sie es ist, durch die Lösung der Übungen zu lernen.
Denken Sie auch daran, dass derzeit die vorgestellten Lösungen nicht unbedingt die besten sind. Dies bedeutet, dass auch wenn Ihre Lösungen denjenigen nicht ähneln, die Sie hier überhaupt finden, bedeutet dies nicht, dass sie schlecht sind.
Um das Upgrade auf neuere Versionen zu erleichtern, haben wir ein Migrationsskript erstellt, das Ihre Installation automatisch in die neueste Version migriert und gleichzeitig Ihre Lösungen bewahrt.
Um das Migrationsskript auszuführen, führen Sie aus:
npm create promises-training@latest -- --migrateDieses Projekt ist unter cc-by-nc-nd 4.0 lizenziert.
Das Ziel dieses Projekts ist es, eine kostenlose Lernressource zu sein und für immer frei und zugänglich zu bleiben.
Hier finden Sie Fragen und Antworten einiger häufiger Fragen zur Lizenz:
Kann ich dieses Projekt zur Selbst- oder Gruppenstudie verwenden?
Ja, bitte.
Kann ich dieses Projekt in einer internen Firmenschulung verwenden?
Ja, solange Sie das Projekt zuschreiben und deutlich machen, dass das Projekt unabhängig von der Schulung frei zugänglich ist.
Kann ich dieses Projekt für meine bezahlten Mentoring-/Workshop -Sitzungen verwenden?
Ja, solange Sie das Projekt zuschreiben, machen Sie deutlich, dass das Projekt unabhängig vom Mentoring/Workshop frei zugänglich ist. Machen Sie deutlich, dass Sie für Ihre Zeit und nicht für das Projekt selbst klar sind, dass das Projekt nicht Teil Ihres eigenen Materials ist, und machen Sie klar, dass wir Sie oder Ihre Dienste nicht unterstützen.
Kann ich dieses Projekt für meinen kostenpflichtigen Online -Kurs verwenden?
Ja, solange Sie das Projekt zuschreiben, machen Sie deutlich, dass das Projekt unabhängig vom Online -Kurs frei zugänglich ist. Machen Sie deutlich, dass Sie für Ihre Zeit berechnet und nicht für das Projekt selbst, machen Sie klar, dass das Projekt nicht Teil Ihres eigenen Materials ist, und machen Sie klar, dass wir Sie oder Ihre Dienste nicht unterstützen.
Kann ich eine Gabel dieses Projekts erstellen und sie für meine eigenen Zwecke verwenden?
Nein, du kannst nicht. Sie können dieses Projekt nur so verwenden, wie es ist, ohne Änderungen. Dies ist notwendig, um zu verhindern, dass Menschen Gabeln erzeugen und dann für sie aufladen.
Kann ich einen Online -Kurs erstellen, der auf diesem Projekt basiert?
Nein, du kannst nicht, weil wir nicht wollen, dass Leute "Wrapper" um dieses Projekt erstellen und dann für sie aufladen.
Wenn Sie Fragen zur Lizenz haben oder über einen bestimmten Anwendungsfall sprechen möchten, können Sie mich gerne unter [email protected] erreichen.