1 VersprechenEin Nachteil von Promise besteht darin, dass es nach seiner Erstellung nicht mehr storniert und somit grundsätzlich nicht beendet werden kann. Aber wir können die Unterbrechung der Anfrage simulieren, indem wir die Aufrufkette oder das Promise unterbrechen. Unterbrechen Sie die AnrufketteDas Unterbrechen der Aufrufkette bedeutet, dass nach der Ausführung eines then/catch-Befehls nachfolgende Kettenaufrufe (einschließlich then, catch und finally) nicht mehr ausgeführt werden. Die Methode besteht darin, eine neue Promise-Instanz in then/catch zurückzugeben und sie im ausstehenden Zustand zu halten: neues Versprechen((lösen, ablehnen) => { setzeTimeout(() => { lösen('Ergebnis'); }); }).dann(res => { // Wenn eine bestimmte Bedingung erfüllt ist, gib eine ausstehende Promise-Instanz zurück, um die Aufrufkette zu unterbrechen, if (res === 'result') { gib ein neues Promise zurück(() => {}); } console.log(res); // kein Drucken }).then(() => { console.log('dann wird es nicht ausgeführt'); // kein Drucken}).catch(() => { console.log('catch nicht ausgeführt'); // kein Drucken}).finally(() => { console.log('schließlich nicht ausgeführt'); // kein Drucken}); Ein Versprechen unterbrechenDas Unterbrechen eines Promises ist nicht dasselbe wie das Abbrechen eines Promises, da ein Promise nicht beendet werden kann. Die Unterbrechung bedeutet hier, das ausstehende Versprechen zum richtigen Zeitpunkt abzulehnen. Ein gängiges Anwendungsszenario besteht beispielsweise darin, ein Timeout für die Netzwerkanforderung festzulegen und diese zu unterbrechen, sobald das Timeout eintritt. Verwenden Sie wie üblich setTimeout, um Netzwerkanforderungen zu simulieren. Der Schwellenwert ist auf Math.random() * 3000 eingestellt, was bedeutet, dass das Ergebnis innerhalb von 3 Sekunden zurückgegeben wird. const request = neues Versprechen((lösen, ablehnen) => { setzeTimeout(() => { resolve('Serverdaten empfangen') }, Math.random() * 3000) }) Unter der Annahme, dass mehr als 2 Sekunden ein Netzwerk-Timeout bedeuten, können wir eine Timeout-Verarbeitungsfunktion kapseln. Da die für Netzwerkanforderungen erforderlichen Ereignisse zufällig sind, kann die Methode Promise.race verwendet werden, um den Zweck der Timeout-Ablehnung zu erreichen. const timeoutReject = (p1, timeout = 2000) => { const p2 = neues Versprechen((lösen, ablehnen) => { setzeTimeout(() => { ablehnen('Netzwerk-Timeout'); }, Zeitüberschreitung); }); gibt Promise.race([p1, p2]) zurück; }; timeoutReject(Anfrage).dann(res => { konsole.log(res); }).catch(err => { console.log(fehler); }); Abbruchmethode umschließen - Axios' CancelToken imitierenDie obige Implementierung ist nicht flexibel, da es viele Möglichkeiten gibt, Promise zu unterbrechen, und nicht nur ein Netzwerk-Timeout. Wir können den Kernquellcode von CancelToken in Axios imitieren und einfach eine Abbruchmethode packen, die Benutzer jederzeit aufrufen können. Funktion abortWrapper(p1) { abbrechen lassen; const p2 = neues Versprechen((lösen, ablehnen) => { Abbrechen = ablehnen; }); // Wenn keine Lösung oder Ablehnung erfolgt, ist der Status von p2 immer „Ausstehend“ const p = Promise.race([p1, p2]); p.abort = abbrechen; Rückgabe p; } const req = abortWrapper(Anfrage); req.then(res => { konsole.log(res); }).catch(err => { console.log(fehler); }); setzeTimeout(() => { // Rufen Sie req.abort manuell auf, um den Status von p2 auf „abgelehnt“ zu ändern req.abort('manuelle Abbruchanforderung'); }, 2000); Der Hauptzweck einer solchen Kapselung besteht darin, die Auflösung oder Ablehnung außerhalb des Promise steuern zu können, sodass Benutzer die Auflösung (Trigger .then) oder Ablehnung (Trigger .catch) jederzeit manuell aufrufen können.
2 RXJS-AbmeldemethodeRxjs selbst bietet eine Methode zum Abbestellen. let stream1$ = neues Observable(Beobachter => { let timeout = setTimeout(() => { Beobachter.next('beobachtbares Timeout'); }, 2000); zurückgeben () => { Zeitüberschreitung löschen (Zeitüberschreitung); } }); let disposable = stream1$.subscribe(Wert => console.log(Wert)); setzeTimeout(() => { Einweg.Abbestellen(); }, 1000); 3 Axios CancelTokenDer CancelToken von Axios kann auf zwei Arten verwendet werden:
importiere Axios von „Axios“; const CancelToken = axios.CancelToken; const Quelle = CancelToken.source(); axios.get('/Benutzer/12345', { cancelToken: Quelle.Token }).catch(Funktion (geworfen) { wenn (axios.isCancel(geworfen)) { console.log('Anfrage abgebrochen', thrown.message); } anders { // Fehler behandeln } }); source.cancel('Vorgang vom Benutzer abgebrochen.');
importiere Axios von „Axios“; const CancelToken = axios.CancelToken; // Erstellen Sie eine Variable wie „cancel“, um die Methode zum Unterbrechen einer Anforderung zu speichern. let cancel; axios.get('/Benutzer/12345', { cancelToken: neues CancelToken(Funktion Executor(c) { cancel = c; // Parameter c zum Abbrechen zuweisen }) }); // Bestimmen Sie, ob „Abbrechen“ eine Funktion ist und stellen Sie sicher, dass Axios ein CancelToken instanziiert hat. wenn (Typ von Abbrechen === 'Funktion') { stornieren(); abbrechen = null; } CancelToken-Kernquellcode: (axios/lib/cancel/CancelToken.js) „streng verwenden“; var Abbrechen = erfordern('./Abbrechen'); /** * Ein „CancelToken“ ist ein Objekt, mit dem die Stornierung einer Operation angefordert werden kann. * * @Klasse * @param {Function} executor Die Executor-Funktion. */ Funktion CancelToken(Executor) { wenn (Typ des Executors !== 'Funktion') { throw new TypeError('Executor muss eine Funktion sein.'); } var lösenPromise; this.promise = neues Versprechen (Funktion promiseExecutor(resolve) { resolvePromise = lösen; }); var token = dies; Executor (Funktion Abbrechen (Nachricht) { wenn (Token.Grund) { // Stornierung wurde bereits beantragt zurückkehren; } token.reason = neue Abbrechen(Nachricht); Versprechen auflösen(token.reason); }); } /** * Löst eine „Abbrechen“-Meldung aus, wenn eine Stornierung angefordert wurde. */ CancelToken.prototype.throwIfRequested = Funktion throwIfRequested() { wenn (dieser.Grund) { wirf diesen.Grund; } }; /** * Gibt ein Objekt zurück, das ein neues „CancelToken“ und eine Funktion enthält, die, wenn sie aufgerufen wird, * storniert den „CancelToken“. */ CancelToken.source = Funktion Quelle() { var abbrechen; var token = neues CancelToken(Funktion Executor(c) { abbrechen = c; }); zurückkehren { Zeichen: Zeichen, abbrechen: abbrechen }; }; module.exports = Token abbrechen; Es ist ersichtlich, dass die im Kernquellcode von CancelToken enthaltene Idee von Axios unten mit der Idee übereinstimmt, die oben beschriebene Abbruchmethode für die Promise-Verpackung zu unterbrechen. Es ist nur so, dass Axios „resolve“ manuell extern aufruft (der Benutzer löst die Methode „cancel“ aus), und sobald „resolve“ aufgerufen wird, löst es die Methode „then“ von „promise“ aus. Sehen wir uns den Quellcode von „promise.then“ an: (axios/lib/adapters/xhr.js) wenn (config.cancelToken) { // Abbruch behandeln config.cancelToken.promise.then(Funktion beiAbgebrochen(Abbrechen) { wenn (!Anfrage) { zurückkehren; } Anfrage.Abbrechen(); ablehnen (abbrechen); // Anfrage bereinigen Anfrage = null; }); } Sie können sehen, dass in der Then-Methode die Abbruchmethode ausgeführt wird, um die Anforderung abzubrechen, und Reject aufgerufen wird, um das äußere Versprechen fehlschlagen zu lassen. Dies ist das Ende dieses Artikels über mehrere detaillierte Lösungen für JavaScript-Interrupt-Anfragen. Weitere relevante Inhalte zu JS-Interrupt-Anfragen finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Einführung in die Docker-Architektur
>>: Detailliertes Beispiel zur Verwendung der distinct-Methode in MySQL
Wie unten dargestellt: 1. ssh -v -p [Portnummer] ...
Inhaltsverzeichnis Vorwort 1. Installieren Sie da...
1. Linux-Netzwerkkonfiguration Bevor Sie das Netz...
Inhaltsverzeichnis 1. Baidu Map API-Zugriff 2. Ve...
MySQL ist eine sehr leistungsfähige relationale D...
Containerprotokolle anzeigen Verwenden Sie zunäch...
Vorwort Was ist Datentypkonvertierung? Der Standa...
Inhaltsverzeichnis Text 1. Maschine vorbereiten 2...
Hinweise zur Installation der MySQL-Datenbank, mi...
Vorwort MySQL setzte auch 2016 seinen starken Wac...
Ich glaube, jeder macht sich oft Sorgen, ob er Bi...
Vielleicht weiß jeder, dass die JS-Ausführung die...
Dieser Artikel listet einige Tipps und Codes zu F...
Problemphänomen Ich habe kürzlich Sysbench verwen...
Aufgrund einiger seiner eigenen Merkmale (Sperren...