


Detaillierte Erläuterung der Serialisierung der JavaScript-Kettenstruktur
1. Übersicht
In JavaScript gibt es zu viele Kettenmustercodes, wie folgt:
if_else:
if(...){ //TODO }else if(...){ //TODO }else{ //TODO }
Schalter:
switch(name){ case ...:{ //TODO break; } case ...:{ //TODO break; } default:{ //TODO } }
Frage: Wie der obige Kettencode, wenn wir ihn flach drücken und anketten wollen? Wollstoff? Wie folgt:
//fn1,f2,f3为处理函数 _if(fn1)._elseIf(fn2)._else(fn3);
Versuchen wir es gemeinsam umzusetzen.
2. Abflachung des Kettencodes
Angenommen, wir haben jetzt den folgenden Kettencode:
if(name === 'Monkey'){ console.log('yes, I am Monkey'); }else if(name === 'Dorie'){ console.log('yes, I am Dorie'); }else{ console.log('sorry, over for ending!'); }
Okay, jetzt werden wir ihn Schritt für Schritt abflachen. Wohnung".
Tatsächlich ist es beim Betrachten des obigen Codes nicht schwer festzustellen, dass das if...else-Format tatsächlich eine einfach verknüpfte Liste in der Datenstruktur ist. Verwenden Sie dann zunächst JavaScript, um eine einfach verknüpfte Liste zu implementieren Liste wie folgt:
var thens = []; thens.resolve = function(name){ for(var i = 0, len = this.length; i < len;i++){ if(this[i](name) !== 'next'){ break; } } } thens.push(f1, f2, f3);
Unter diesen sind f1, f2 und f3 Beurteilungsfunktionen, und wir gehen davon aus, dass wir weiter nach unten suchen, wenn f1, f2 und f3 „nächstes“ zurückgeben. andernfalls hören wir auf, nach unten zu suchen. Wie folgt:
function f1(name){ if(name === 'Monkey'){ console.log('yes, I am Monkey'); }else{ return 'next'; } } function f2(name){ if(name === 'Dorie'){ console.log('yes, I am Dorie'); }else{ return 'next'; } } function f3(){ console.log('sorry, over for ending!'); }
Okay, das ist das Muster der verknüpften Liste.
Allerdings unser oberstes Ziel ist es, Folgendes zu erreichen?
//fn1,f2,f3为处理函数 _if(fn1)._elseIf(fn2)._else(fn3);
Man könnte sagen, wäre es nicht schön, den obigen Code wie folgt zu ändern? ! !
thens.push(f1).push(f2).push(f3).resolve();
Aber Die Push-Methode von JavaScript gibt die neue Länge des Arrays zurück, nicht das Array-Objekt.
Also dann können wir nur eine neue Add-Methode schreiben, die den gleichen Effekt wie Push hat, aber ein Array-Objekt zurückgibt. Wie folgt:
thens.add = function(f){ if(typeof f === 'function'){ this.push(f); return this; } }
Der Testcode lautet wie folgt:
var thens = []; thens.add = function(f){ if(typeof f === 'function'){ this.push(f); return this; } } thens.resolve = function(name){ for(var i = 0, len = this.length; i < len;i++){ if(this[i](name) !== 'next'){ break; } } } thens.add(f1).add(f2).add(f3).resolve();
Dies hat jedoch einen Nachteil. Wir binden die Add- und Resolution-Methoden an globale Variable then Sie können die Methode nicht jedes Mal kopieren und einfügen, wenn Sie ein Array erstellen, daher lautet der umgestaltete Code wie folgt:
function Slink(){ this.thens = []; this.thens.add = function(f){ if(typeof f === 'function'){ this.push(f); return this; } } this.thens.resolve = function(name){ for(var i = 0, len = this.length; i < len;i++){ if(this[i](name) !== 'next'){ break; } } } }
Offensichtlich werden öffentliche Methoden wie add und restart jedes Mal verwendet ist instanziiert. Es ist unwissenschaftlich, sie alle zu erstellen. Verwenden Sie daher den Prototyp, um die Verformung auf der ursprünglichen Basis wie folgt fortzusetzen:
function Slink(){ this.thens = []; } Slink.prototype = { add: function(f){ if(typeof f === 'function'){ this.thens.push(f); return this; } }, resolve: function(name){ for(var i = 0, len = this.thens.length; i < len; i++){ if(this.thens[i](name) !== 'next'){ break; } } } }
Der Testcode lautet wie folgt:
var thens = new Slink(); thens.add(f1).add(f2).add(f3); thens.resolve();
Ja, aber in diesem Fall müssen wir jedes Mal manuell einen neuen Slink erstellen, was etwas mühsam ist. Daher kapseln wir den neuen Slink-Prozess wie folgt in eine Funktion :
function $go(f){ return new Slink(f); } function Slink(f){ this.thens = []; this.thens.push(f); } Slink.prototype = { add: function(f){ if(typeof f === 'function'){ this.thens.push(f); return this; } }, resolve: function(name){ for(var i = 0, len = this.thens.length; i < len; i++){ if(this.thens[i](name) !== 'next'){ break; } } } }
Der Testcode lautet wie folgt:
$go(f1).add(f2).add(f3).resolve();
Okay, Sie sind fertig, jetzt kommt das grammatikalische Zuckerproblem. Der Code ist organisiert wie folgt:
function _if(f){ return new Slink(f); } function Slink(f){ this.thens = []; this.thens.push(f); } Slink.prototype = { _elseIf: function(f){ if(typeof f === 'function'){ this.thens.push(f); return this; } }, _else: function(f){ return this._elseIf(f); }, resolve: function(name){ for(var i = 0, len = this.thens.length; i < len; i++){ if(this.thens[i](name) !== 'next'){ break; } } return this; } }
Der Testcode lautet wie folgt:
_if(f1)._elseIf(f2)._else(f3).resolve();
Natürlich können Sie zusätzlich zur Verwendung von Arrays auch verwenden Verschlüsseum einen Kettenabflachungseffekt zu erzielen, wie folgt:
var func = Function.prototype; func._else = func._elseIf = function(fn){ var _this = this; return function(){ var res = _this.apply(this,arguments); if(res==="next"){ //值为Boolean return fn.apply(this,arguments); } return res; } }
Der Testcode lautet wie folgt:
function f1(name){ if(name === 'Monkey'){ console.log('yes, I am Monkey'); }else{ return 'next'; } } function f2(name){ if(name === 'Dorie'){ console.log('yes, I am Dorie'); }else{ return 'next'; } } function f3(){ console.log('sorry, over for ending!'); } f1._elseIf(f2)._else(f3)('Dorie');
3 Codekette
Was wir oben besprochen haben, sind alle synchrone Prozesse. Wenn Kettenaufrufe vorliegen, gibt es eine asynchrone Situation in der Funktion?
Was bedeutet das? Wie folgt:
function f1(name){ setTimeout(function(){ if(name === 'Monkey'){ console.log('yes, I am Monkey'); }else{ return 'next'; } }, 2000); } function f2(name){ if(name === 'Dorie'){ console.log('yes, I am Dorie'); }else{ return 'next'; } } function f3(){ console.log('sorry, over for ending!'); }
Wir haben f1 mithilfe von setTimeout asynchron gemacht. Gemäß der Logik des obigen Codes sollten wir warten, bis f1 vollständig ausgeführt wurde (einschließlich der Ausführung von setTimeout), bevor wir entscheiden, ob f2 ausgeführt werden soll ist das wirklich so?
Der Testcode lautet wie folgt:
_if(f1)._elseIf(f2)._else(f3).resolve();
Das Ergebnis der Ausführung des Codes ist, dass nichts ausgegeben wird.
Warum?
Weil JavaScript Single-Threaded ist. Weitere Informationen finden Sie hier.
Wie lässt sich das Problem lösen?
Da es asynchronen Code gibt und die nachfolgende Kette nach dem asynchronen Code verarbeitet werden muss, warten wir auf die Ausführung des asynchronen Codes, bevor wir die nachfolgende Kette wie folgt ausführen:
function f1(name){ setTimeout(function(){ if(name === 'Monkey'){ console.log('yes, I am Monkey'); }else{ //处理后续链 this.resolve(name, 1);//1代表下一个需处理函数在数组中的位置 } }.bind(this), 2000); }
Okay, da wir in der Funktion dies verwendet haben, das das Slink-Objekt darstellt, und die Auflösungsmethode geändert haben, müssen wir den Slink-Konstruktor und die Prototypenkette wie folgt optimieren:
function Slink(f){ this.thens = []; this.thens.push(f.bind(this)); } Slink.prototype = { _elseIf: function(f){ if(typeof f === 'function'){ this.thens.push(f.bind(this)); return this; } }, _else: function(f){ return this._elseIf(f.bind(this)); }, resolve: function(name, flag){ for(var i = flag, len = this.thens.length; i < len; i++){ if(this.thens[i](name) !== 'next'){ break; } } return this; } }
The Der Testcode lautet wie folgt:
function f1(name){ setTimeout(function(){ if(name === 'Monkey'){ console.log('yes, I am Monkey'); }else{ //处理后续链 this.resolve(name, 1);//1代表下一个需处理函数在数组中的位置 } }.bind(this), 2000); } function f2(name){ if(name === 'Dorie'){ console.log('yes, I am Dorie'); }else{ return 'next'; } } function f3(){ console.log('sorry, over for ending!'); } _if(f1)._elseIf(f2)._else(f3).resolve('',0);
Haha, wenn Sie Promise kennen, denken Sie, dass es so ähnlich ist?
Ja, der Zweck ist derselbe, nämlich den Zweck der Reduzierung des asynchronen Codes zu erreichen, aber der Code hier ist viel einfacher als Promise. Einzelheiten zu Promise finden Sie hier.
Das Obige ist die detaillierte Erklärung der Serialisierung der JavaScript-Kettenstruktur. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



So implementieren Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem. Einführung: Mit der kontinuierlichen Weiterentwicklung der Technologie ist die Spracherkennungstechnologie zu einem wichtigen Bestandteil des Bereichs der künstlichen Intelligenz geworden. Das auf WebSocket und JavaScript basierende Online-Spracherkennungssystem zeichnet sich durch geringe Latenz, Echtzeit und plattformübergreifende Eigenschaften aus und hat sich zu einer weit verbreiteten Lösung entwickelt. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem implementieren.

WebSocket und JavaScript: Schlüsseltechnologien zur Realisierung von Echtzeit-Überwachungssystemen Einführung: Mit der rasanten Entwicklung der Internet-Technologie wurden Echtzeit-Überwachungssysteme in verschiedenen Bereichen weit verbreitet eingesetzt. Eine der Schlüsseltechnologien zur Erzielung einer Echtzeitüberwachung ist die Kombination von WebSocket und JavaScript. In diesem Artikel wird die Anwendung von WebSocket und JavaScript in Echtzeitüberwachungssystemen vorgestellt, Codebeispiele gegeben und deren Implementierungsprinzipien ausführlich erläutert. 1. WebSocket-Technologie

Einführung in die Verwendung von JavaScript und WebSocket zur Implementierung eines Online-Bestellsystems in Echtzeit: Mit der Popularität des Internets und dem Fortschritt der Technologie haben immer mehr Restaurants damit begonnen, Online-Bestelldienste anzubieten. Um ein Echtzeit-Online-Bestellsystem zu implementieren, können wir JavaScript und WebSocket-Technologie verwenden. WebSocket ist ein Vollduplex-Kommunikationsprotokoll, das auf dem TCP-Protokoll basiert und eine bidirektionale Kommunikation zwischen Client und Server in Echtzeit realisieren kann. Im Echtzeit-Online-Bestellsystem, wenn der Benutzer Gerichte auswählt und eine Bestellung aufgibt

So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript. Im heutigen digitalen Zeitalter müssen immer mehr Unternehmen und Dienste Online-Reservierungsfunktionen bereitstellen. Es ist von entscheidender Bedeutung, ein effizientes Online-Reservierungssystem in Echtzeit zu implementieren. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Reservierungssystem implementieren, und es werden spezifische Codebeispiele bereitgestellt. 1. Was ist WebSocket? WebSocket ist eine Vollduplex-Methode für eine einzelne TCP-Verbindung.

JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems Einführung: Heutzutage ist die Genauigkeit von Wettervorhersagen für das tägliche Leben und die Entscheidungsfindung von großer Bedeutung. Mit der Weiterentwicklung der Technologie können wir genauere und zuverlässigere Wettervorhersagen liefern, indem wir Wetterdaten in Echtzeit erhalten. In diesem Artikel erfahren Sie, wie Sie mit JavaScript und WebSocket-Technologie ein effizientes Echtzeit-Wettervorhersagesystem aufbauen. In diesem Artikel wird der Implementierungsprozess anhand spezifischer Codebeispiele demonstriert. Wir

JavaScript-Tutorial: So erhalten Sie HTTP-Statuscode. Es sind spezifische Codebeispiele erforderlich. Vorwort: Bei der Webentwicklung ist häufig die Dateninteraktion mit dem Server erforderlich. Bei der Kommunikation mit dem Server müssen wir häufig den zurückgegebenen HTTP-Statuscode abrufen, um festzustellen, ob der Vorgang erfolgreich ist, und die entsprechende Verarbeitung basierend auf verschiedenen Statuscodes durchführen. In diesem Artikel erfahren Sie, wie Sie mit JavaScript HTTP-Statuscodes abrufen und einige praktische Codebeispiele bereitstellen. Verwenden von XMLHttpRequest

Die Auswirkungen der Serialisierung auf die Java-Leistung: Der Serialisierungsprozess basiert auf Reflexion, was sich erheblich auf die Leistung auswirkt. Die Serialisierung erfordert die Erstellung eines Bytestroms zum Speichern von Objektdaten, was zu Speicherzuweisungs- und Verarbeitungskosten führt. Das Serialisieren großer Objekte verbraucht viel Speicher und Zeit. Serialisierte Objekte erhöhen die Belastung, wenn sie über das Netzwerk übertragen werden.

Einführung in die Methode zum Abrufen des HTTP-Statuscodes in JavaScript: Bei der Front-End-Entwicklung müssen wir uns häufig mit der Interaktion mit der Back-End-Schnittstelle befassen, und der HTTP-Statuscode ist ein sehr wichtiger Teil davon. Das Verstehen und Abrufen von HTTP-Statuscodes hilft uns, die von der Schnittstelle zurückgegebenen Daten besser zu verarbeiten. In diesem Artikel wird erläutert, wie Sie mithilfe von JavaScript HTTP-Statuscodes erhalten, und es werden spezifische Codebeispiele bereitgestellt. 1. Was ist ein HTTP-Statuscode? HTTP-Statuscode bedeutet, dass der Dienst den Dienst anfordert, wenn er eine Anfrage an den Server initiiert
