Seit der Veröffentlichung der Funktionen Promise ES2015 und async/await ES2017 von ECMAScript ist Asynchronie in der Front-End-Welt zu einer besonders häufigen Operation geworden. Es gibt einige Unterschiede in der Reihenfolge, in der asynchroner und synchroner Code Probleme verarbeiten. Das Schreiben von asynchronem Code erfordert ein anderes „Bewusstsein“ als das Schreiben von synchronem Code. Was passiert, wenn die Ausführung eines Codes lange dauert?Handelt es sich um synchronen Code, kommt es zu einem Phänomen namens „Nichtreagieren“ oder, um es in Laiensprache auszudrücken, „Tod“. Was aber, wenn es sich um asynchronen Code handelt? Möglicherweise erhalten wir das Ergebnis nicht, aber anderer Code wird fortgesetzt, als wäre nichts passiert. Natürlich ist es nicht so, dass die Sache nicht wirklich passiert wäre, es treten nur unter unterschiedlichen Umständen unterschiedliche Phänomene auf. Beispielsweise sieht eine Seite mit einer Ladeanimation so aus, als würde sie ständig geladen. Ein anderes Beispiel ist eine Seite, die Daten aktualisieren sollte, bei der Sie die Datenänderung jedoch nicht sehen können. Beispielsweise kann ein Dialogfeld auf keinen Fall geschlossen werden ... Dieses Phänomen wird von uns als BUGs bezeichnet. Es gibt aber auch Fälle, in denen ein asynchroner Vorgang kein „Echo“ ausgibt und stillschweigend beendet wird. Niemand weiß davon, und nach dem Aktualisieren der Seite bleibt nicht einmal eine Spur davon übrig. Axios verfügt über eine Timeout-BehandlungDie Verwendung von Axios zum Tätigen von Web-API-Aufrufen ist ein gängiger asynchroner Betriebsvorgang. Normalerweise wird unser Code folgendermaßen geschrieben: versuchen { const res = warte auf axios.get(URL, Optionen); //TODO, fahren Sie mit den nachfolgenden Aufgaben wie gewohnt fort} catch(err) { // TODO: Fehlertoleranz durchführen oder einen Fehler melden} Dieser Code funktioniert normalerweise gut, bis sich eines Tages ein Benutzer beschwert: Warum erfolgt nach so langer Wartezeit keine Antwort? Dann erkannte der Entwickler, dass es aufgrund der erhöhten Belastung des Servers schwierig war, sofort auf diese Anfrage zu reagieren. Unter Berücksichtigung der Gefühle des Benutzers wird eine Ladeanimation hinzugefügt: versuchen { zeigeLaden(); const res = warte auf axios.get(URL, Optionen); //TODO normales Geschäft} catch (err) { //TODO Fehlertoleranzverarbeitung} finally { ausblendenLaden(); } Eines Tages sagte jedoch ein Benutzer: „Ich habe eine halbe Stunde gewartet, aber es drehte sich einfach immer weiter im Kreis!“ Der Entwickler erkannte also, dass die Anfrage aus irgendeinem Grund hängen geblieben war. In diesem Fall sollte die Anfrage erneut gesendet oder direkt an den Benutzer gemeldet werden – oder es sollte eine Timeout-Prüfung hinzugefügt werden. Glücklicherweise kann Axios mit Timeouts umgehen. Fügen Sie einfach ein versuchen {...} fangen (Fehler) { wenn (err.isAxiosError && !err.response && err.request && err.message.startsWith("Zeitüberschreitung")) { // Wenn die Axios-Anfrage falsch ist und es sich bei der Nachricht um eine verzögerte Nachricht handelt, // behandelt TODO das Timeout} } Endlich {...} Axios ist in Ordnung, aber was ist, wenn wir Umgang mit fetch()-Timeouts Wenn Sie einen const ac = neuer AbortController(); const { signal } = ac; holen(URL, {Signal}).dann(res => { //TODO Geschäftliches erledigen}); // Den Abrufvorgang nach 1 Sekunde abbrechen. setTimeout(() => ac.abort(), 1000); Das obige Beispiel zeigt, wie die Timeout-Behandlung für const ac = neuer AbortController(); const { signal } = ac; setTimeout(() => ac.abort(), 1000); const res = warte auf fetch(url, { signal }).catch(() => undefiniert); Um die Verwendung Wir hätten hier aufhören können, aber das Schreiben eines so langen Codestücks für jeden asynchrone Funktion fetchWithTimeout(timeout, resoure, init = {}) { const ac = neuer AbortController(); konstantes Signal = Wechselstromsignal; setTimeout(() => ac.abort(), Zeitüberschreitung); returniere fetch(Ressource, { ...init, Signal }); } Ist das ok? Nein, es gibt ein Problem. Wenn wir im setzeTimeout(() => { console.log("Es ist eine Zeitüberschreitung"); ac.abort(); }, Zeitüberschreitung); Und geben Sie dem Anruf ausreichend Zeit: fetchWithTimeout(5000, url).then(res => console.log("Erfolg")); Wir sehen die Ausgabe Übrigens: Obwohl wir das Timeout für asynchrone Funktion fetchWithTimeout(timeout, resoure, init = {}) { const ac = neuer AbortController(); konstantes Signal = Wechselstromsignal; const timer = setTimeout(() => { console.log("Es ist eine Zeitüberschreitung"); return ac.abort(); }, Zeitüberschreitung); versuchen { returniere „warte auf Abruf“ (Ressource, { ...init, Signal }); Endlich Zeitüberschreitung löschen(Timer); } } Perfekt! Aber das Problem ist noch nicht gelöst. Bei allem kann es zu einer Zeitüberschreitung kommen Sowohl Axios als auch Fetch bieten Möglichkeiten, asynchrone Vorgänge zu unterbrechen, aber was ist mit einem normalen Promise, das nicht über Zu einem solchen Versprechen kann ich nur sagen: Lasst ihn gehen, lasst ihn es bis ans Ende aller Zeiten tun – ich kann ihn sowieso nicht aufhalten. Aber das Leben muss weitergehen, ich kann nicht länger warten! In diesem Fall können wir Rennen bedeutet Rennen, also ist das Verhalten von Funktion warteMitTimeout(Versprechen, Timeout, TimeoutMessage = "Timeout") { lass den Timer; const timeoutPromise = neues Versprechen((_, ablehnen) => { Timer = Timeout festlegen(() => ablehnen(Timeout-Nachricht), Zeitüberschreitung); }); returniere Promise.race([timeoutPromise, Versprechen]) .finally(() => clearTimeout(timer)); // Vergessen Sie nicht, den Timer zu löschen } Sie können ein Timeout schreiben, um den Effekt zu simulieren: (asynchron () => { const business = neues Versprechen(auflösen => setTimeout(auflösen, 1000 * 10)); versuchen { warte auf waitWithTimeout(business, 1000); console.log("[Erfolg]"); } fangen (Fehler) { console.log("[Fehler]", err); // [Fehler] Zeitüberschreitung } })(); Oben finden Sie ausführliche Informationen zur perfekten Lösung für asynchrone Front-End-Timeout-Operationen in JavaScript. Weitere Informationen zur Lösung asynchroner Front-End-Timeout-Operationen finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: So ändern Sie die Standardübermittlungsmethode des Formulars
>>: Beispielcode zur Implementierung einer Hohlmaskenebene mit CSS
Einführung in Docker Docker ist eine Open-Source-...
In diesem Artikelbeispiel wird der spezifische Co...
Windows 10 1903 ist die neueste Version des Windo...
Inhaltsverzeichnis Grundtypen jeder Typ Arrays Tu...
eins, G:\MySQL\MySQL Server 5.7\bin> mysqld --...
In diesem Artikel wird der spezifische Code für J...
Hallo zusammen, ich bin Tony, ein Lehrer, der nur...
MySQL erstellt Benutzer und autorisiert und wider...
Während des jüngsten Entwicklungsprozesses handel...
In MySQL gibt es überall Caches. Wenn ich den Que...
Inhaltsverzeichnis 1. Was ist syntaktischer Zucke...
Inhaltsverzeichnis 1. Reverse-Proxy-Vorbereitung ...
Verwenden von UNION Die meisten SQL-Abfragen best...
Ich habe gerade einen von JunChen verfassten Beitr...
Bild herunterladen Auswählen eines MySQL-Images D...