Wir verwenden die Standardparameterzuweisung, um anzuweisen, dass sie nicht standardmäßig abgebrochen werden soll. Dadurch ist der Parameter cancel praktisch optional., Dann setzen wir das Timeout wie zuvor, aber dieses Mal erfassen wir die ID des Timeouts, damit wir es später löschen können.
Wir verwenden diecancel.then() – Methode, um die Stornierung und Ressourcenbereinigung zu behandeln. Dies wird nur ausgeführt, wenn das Versprechen abgebrochen wird, bevor es aufgelöst werden kann. Wenn Sie zu spät stornieren, haben Sie Ihre Chance verpasst. Der Zug hat den Bahnhof verlassen.
Hinweis: Sie fragen sich vielleicht, wofür die noop() – Funktion gedacht ist. Das Wort noop steht für no-op und bedeutet eine Funktion, die nichts tut., Ohne sie löst V8 Warnungen aus: UnhandledPromiseRejectionWarning: Unhandled promise rejection. Es ist eine gute Idee, Versprechen immer abzulehnen, auch wenn Ihr Handler eine noop().
Abstraktion Versprechen Widerrufs
Dies ist in Ordnung für ein wait() timer, aber wir können Abstrakt diese Idee weiter zu Kapseln, alles was Sie haben zu erinnern:
Abweisen Abbrechen Versprechen durch Standard, wir don nicht wollen zu stornieren oder zu werfen Fehler, wenn kein Abbrechen Versprechen bekommt übergeben.
Denken Sie daran, die Bereinigung durchzuführen, wenn Sie Stornierungen ablehnen.,
Denken Sie daran, dass die onCancel Bereinigung selbst einen Fehler auslösen kann und dieser Fehler auch behandelt werden muss. (Beachten Sie, dass die Fehlerbehandlung im obigen Wait-Beispiel weggelassen wird — es ist leicht zu vergessen!)
Lassen Sie uns ein cancellable promise Utility erstellen, mit dem Sie jedes Versprechen umbrechen können., Um beispielsweise Netzwerkanforderungen usw. zu verarbeiten, sieht die Signatur folgendermaßen aus:
Die SpecFunction ist genau wie die Funktion, die Sie an den Promise Konstruktor übergeben würden, mit einer Ausnahme — sie benötigt eine onCancel() Handler:
Beachten Sie, dass dieses Beispiel nur eine Illustration ist, um Ihnen den Kern der Funktionsweise zu geben. Es gibt einige andere Randfälle, die Sie berücksichtigen müssen., In dieser Version wird beispielsweise handleCancel aufgerufen, wenn Sie das Versprechen abbrechen, nachdem es bereits abgeschlossen ist.
Ich habe eine gepflegte Produktionsversion davon implementiert, wobei Edge-Fälle als Open-Source-Bibliothek behandelt werden, Spekulation.
Verwenden wir die verbesserte Bibliotheksabstraktion, um das Dienstprogramm cancellable wait() von zuvor neu zu schreiben., Installieren Sie zuerst die Spekulation:
npm install --save speculation
Jetzt können Sie sie importieren und verwenden:
Dies vereinfacht die Dinge ein wenig, da Sie sich keine Sorgen um die noop() machen müssen, in Ihrem onCancel(), Funktion oder andere Randfälle. Diese Details wurden von speculation()abstrahiert. Überprüfen Sie es und fühlen Sie sich frei, es in realen Projekten zu verwenden.,
Extras des nativen JS-Versprechens
Das nativePromise – Objekt enthält einige zusätzliche Dinge, an denen Sie interessiert sein könnten:
Promise.reject() gibt ein abgelehntes Versprechen zurück.
Promise.resolve() gibt ein Versprechen gelöst.
Promise.race() nimmt ein Array (oder ein beliebiges iterables) und gibt ein Versprechen zurück, das mit dem Wert des ersten aufgelösten Versprechens im iterable aufgelöst wird, oder lehnt es mit dem Grund des ersten Versprechens ab, das abgelehnt wird.,
Promise.all() nimmt ein Array (oder ein beliebiges iterables) und gibt ein Versprechen zurück, das aufgelöst wird, wenn alle Versprechen im iterablen Argument aufgelöst sind, oder lehnt mit dem Grund des ersten übergebenen Versprechens ab, das abgelehnt wird.
Versprechungen sind zu einem integralen Bestandteil mehrerer Redewendungen in JavaScript geworden, einschließlich des WHATWG Fetch-Standards, der für die meisten modernen Ajax-Anforderungen verwendet wird, und des asynchronen Funktionsstandards, der verwendet wird, um asynchronen Code synchron aussehen zu lassen.,
Asynchrone Funktionen sind zum Zeitpunkt dieses Schreibens Stufe 3, aber ich gehe davon aus, dass sie bald eine sehr beliebte, sehr häufig verwendete Lösung für die asynchrone Programmierung in JavaScript werden — was bedeutet, dass das Lernen, Versprechen zu schätzen, für JavaScript-Entwickler in naher Zukunft noch wichtiger sein wird.
Wenn Sie beispielsweise Redux verwenden, empfehle ich Ihnen, redux-saga: Eine Bibliothek zum Verwalten von Nebenwirkungen in Redux, die in der gesamten Dokumentation von asynchronen Funktionen abhängt.,
Ich hoffe, dass selbst erfahrene Promise-Benutzer besser verstehen, was Versprechen sind und wie sie funktionieren und wie sie sie nach dem Lesen besser nutzen können.
Entdecken Sie die Serie
Was ist ein Abschluss?
Was ist der Unterschied zwischen Klassen-und Prototypenvererbung?