


Lassen Sie uns noch einmal über die asynchrone JavaScript-Programmierung sprechen_Javascript-Fähigkeiten
Mit der Entwicklung des Front-Ends wird das Wort „asynchron“ immer häufiger verwendet. Angenommen, wir haben jetzt eine solche asynchrone Aufgabe:
Initiieren Sie mehrere Anfragen an den Server und die Ergebnisse jeder Anfrage werden als Parameter für die nächste Anfrage verwendet.
Werfen wir einen Blick darauf, was wir tun müssen:
Rückrufe
Das erste, was mir in den Sinn kommt und am häufigsten verwendet wird, ist die Rückruffunktion: Machen wir eine einfache Kapselung:
let makeAjaxCall = (url, cb) => { // do some ajax // callback with result } makeAjaxCall('http://url1', (result) => { result = JSON.parse(result) })
Hmm, sieht ziemlich gut aus! Aber wenn wir versuchen, mehrere Aufgaben zu verschachteln, sieht der Code so aus:
makeAjaxCall('http://url1', (result) => { result = JSON.parse(result) makeAjaxCall(`http://url2?q=${result.query}`, (result) => { result = JSON.parse(result) makeAjaxCall(`http://url3?q=${result.query}`, (result) => { // ... }) }) })
Oh mein Gott! Lass diesen Haufen }) zur Hölle fahren!
Wir möchten also versuchen, das JavaScript-Ereignismodell zu verwenden:
1. Pub/Sub
Bei der Verarbeitung von DOM-Ereignissen ist Pub/Sub ein sehr verbreiteter Mechanismus. Beispielsweise müssen wir Elementen eine Ereignisüberwachung hinzufügen:
elem.addEventListener(type, (evt) => { // handler })
Können wir also ein ähnliches Modell erstellen, um asynchrone Aufgaben zu bewältigen?
Der erste Schritt besteht darin, ein Vertriebszentrum aufzubauen und die On/Emit-Methode hinzuzufügen:
let PubSub = { events: {}, on(type, handler) { let events = this.events events[type] = events[type] || [] events[type].push(handler) }, emit(type, ...datas) { let events = this.events if (!events[type]) { return } events[type].forEach((handler) => handler(...datas)) } }
Dann können wir es so verwenden:
const urls = [ 'http://url1', 'http://url2', 'http://url3' ] let makeAjaxCall = (url) => { // do some ajax PubSub.emit('ajaxEnd', result) } let subscribe = (urls) => { let index = 0 PubSub.on('ajaxEnd', (result) => { result = JSON.parse(result) if (urls[++index]) { makeAjaxCall(`${urls[index]}?q=${result.query}`) } }) makeAjaxCall(urls[0]) }
Im Vergleich zur Callback-Funktion scheint es keine revolutionäre Änderung zu geben, aber der Vorteil besteht darin, dass wir die Anforderungs- und Verarbeitungsfunktionen in verschiedene Module unterbringen können, um die Kopplung zu reduzieren.
2. Versprechen
Die wirklich revolutionäre Änderung ist die Promise-Spezifikation. Mit Promise können wir asynchrone Aufgaben wie diese erledigen:
let makeAjaxCall = (url) => { return new Promise((resolve, reject) => { // do some ajax resolve(result) }) } makeAjaxCall('http://url1') .then(JSON.parse) .then((result) => makeAjaxCall(`http://url2?q=${result.query}`)) .then(JSON.parse) .then((result) => makeAjaxCall(`http://url3?q=${result.query}`))
Großartig! Es ist wie eine synchrone Funktion geschrieben!
Mach dir keine Sorgen, junger Mann. Wir haben noch besseres:
3. Generatoren
Ein weiterer großer Killer von ES6 sind Generatoren[2]. In einer Generatorfunktion können wir die Ausführung der Funktion über die yield-Anweisung unterbrechen und Anweisungen über die nächste Methode außerhalb der Funktion wiederholen. Noch wichtiger ist, dass wir über die nächste Methode Daten in die Funktion einfügen können, um das Verhalten der Funktion dynamisch zu ändern Funktion. Zum Beispiel:
function* gen() { let a = yield 1 let b = yield a * 2 return b } let it = gen() it.next() // output: {value: 1, done: false} it.next(10) // a = 10, output: {value: 20, done: false} it.next(100) // b = 100, output: {value: 100, done: true}
Kapseln Sie unsere vorherige makeAjaxCall-Funktion durch einen Generator:
let makeAjaxCall = (url) => { // do some ajax iterator.next(result) } function* requests() { let result = yield makeAjaxCall('http://url1') result = JSON.parse(result) result = yield makeAjaxCall(`http://url2?q=${result.query}`) result = JSON.parse(result) result = yield makeAjaxCall(`http://url3?q=${result.query}`) } let iterator = requests() iterator.next() // get everything start
Oh! Die Logik scheint sehr klar zu sein, aber es fühlt sich so unangenehm an, den Iterator jedes Mal von außen einfügen zu müssen ...
Keine Sorge, lass uns Promise und Generator mischen und sehen, welche schwarze Magie dabei entsteht:
let makeAjaxCall = (url) => { return new Promise((resolve, reject) => { // do some ajax resolve(result) }) } let runGen = (gen) => { let it = gen() let continuer = (value, err) => { let ret try { ret = err ? it.throw(err) : it.next(value) } catch (e) { return Promise.reject(e) } if (ret.done) { return ret.value } return Promise .resolve(ret.value) .then(continuer) .catch((e) => continuer(null, e)) } return continuer() } function* requests() { let result = yield makeAjaxCall('http://url1') result = JSON.parse(result) result = yield makeAjaxCall(`http://url2?q=${result.query}`) result = JSON.parse(result) result = yield makeAjaxCall(`http://url3?q=${result.query}`) } runGen(requests)
Die runGen-Funktion sieht aus wie ein Automat, so großartig!
Eigentlich ist diese runGen-Methode eine Implementierung der asynchronen ECMAScript 7-Funktion:
4. Asynchrone Funktion
In ES7 wird eine natürlichere asynchrone Funktion[3] eingeführt. Mit der asynchronen Funktion können wir die Aufgabe wie folgt erledigen:
let makeAjaxCall = (url) => { return new Promise((resolve, reject) => { // do some ajax resolve(result) }) } ;(async () => { let result = await makeAjaxCall('http://url1') result = JSON.parse(result) result = await makeAjaxCall(`http://url2?q=${result.query}`) result = JSON.parse(result) result = await makeAjaxCall(`http://url3?q=${result.query}`) })()
Genau wie bei der Kombination von Promise und Generator oben akzeptiert das Schlüsselwort „await“ auch ein Promise. In der asynchronen Funktion werden die verbleibenden Anweisungen erst ausgeführt, nachdem die Anweisung nach dem Warten abgeschlossen ist. Der gesamte Prozess ist genau so, als würden wir die Funktion runGen verwenden, um den Generator zu kapseln.
Die oben genannten sind mehrere asynchrone JavaScript-Programmiermodi, die in diesem Artikel zusammengefasst sind. Ich hoffe, dass sie für das Lernen aller hilfreich sein werden.

Es ist für Entwickler wichtig, zu verstehen, wie die JavaScript -Engine intern funktioniert, da sie effizientere Code schreibt und Leistungs Engpässe und Optimierungsstrategien verstehen kann. 1) Der Workflow der Engine umfasst drei Phasen: Parsen, Kompilieren und Ausführung; 2) Während des Ausführungsprozesses führt die Engine dynamische Optimierung durch, wie z. B. Inline -Cache und versteckte Klassen. 3) Zu Best Practices gehören die Vermeidung globaler Variablen, die Optimierung von Schleifen, die Verwendung von const und lass und die Vermeidung übermäßiger Verwendung von Schließungen.

Python eignet sich besser für Anfänger mit einer reibungslosen Lernkurve und einer kurzen Syntax. JavaScript ist für die Front-End-Entwicklung mit einer steilen Lernkurve und einer flexiblen Syntax geeignet. 1. Python-Syntax ist intuitiv und für die Entwicklung von Datenwissenschaften und Back-End-Entwicklung geeignet. 2. JavaScript ist flexibel und in Front-End- und serverseitiger Programmierung weit verbreitet.

Python und JavaScript haben ihre eigenen Vor- und Nachteile in Bezug auf Gemeinschaft, Bibliotheken und Ressourcen. 1) Die Python-Community ist freundlich und für Anfänger geeignet, aber die Front-End-Entwicklungsressourcen sind nicht so reich wie JavaScript. 2) Python ist leistungsstark in Bibliotheken für Datenwissenschaft und maschinelles Lernen, während JavaScript in Bibliotheken und Front-End-Entwicklungsbibliotheken und Frameworks besser ist. 3) Beide haben reichhaltige Lernressourcen, aber Python eignet sich zum Beginn der offiziellen Dokumente, während JavaScript mit Mdnwebdocs besser ist. Die Wahl sollte auf Projektbedürfnissen und persönlichen Interessen beruhen.

Die Verschiebung von C/C zu JavaScript erfordert die Anpassung an dynamische Typisierung, Müllsammlung und asynchrone Programmierung. 1) C/C ist eine statisch typisierte Sprache, die eine manuelle Speicherverwaltung erfordert, während JavaScript dynamisch eingegeben und die Müllsammlung automatisch verarbeitet wird. 2) C/C muss in den Maschinencode kompiliert werden, während JavaScript eine interpretierte Sprache ist. 3) JavaScript führt Konzepte wie Verschlüsse, Prototypketten und Versprechen ein, die die Flexibilität und asynchrone Programmierfunktionen verbessern.

Unterschiedliche JavaScript -Motoren haben unterschiedliche Auswirkungen beim Analysieren und Ausführen von JavaScript -Code, da sich die Implementierungsprinzipien und Optimierungsstrategien jeder Engine unterscheiden. 1. Lexikalanalyse: Quellcode in die lexikalische Einheit umwandeln. 2. Grammatikanalyse: Erzeugen Sie einen abstrakten Syntaxbaum. 3. Optimierung und Kompilierung: Generieren Sie den Maschinencode über den JIT -Compiler. 4. Führen Sie aus: Führen Sie den Maschinencode aus. V8 Engine optimiert durch sofortige Kompilierung und versteckte Klasse.

Zu den Anwendungen von JavaScript in der realen Welt gehören die serverseitige Programmierung, die Entwicklung mobiler Anwendungen und das Internet der Dinge. Die serverseitige Programmierung wird über node.js realisiert, die für die hohe gleichzeitige Anfrageverarbeitung geeignet sind. 2. Die Entwicklung der mobilen Anwendungen erfolgt durch reaktnative und unterstützt die plattformübergreifende Bereitstellung. 3.. Wird für die Steuerung von IoT-Geräten über die Johnny-Five-Bibliothek verwendet, geeignet für Hardware-Interaktion.

Ich habe eine funktionale SaaS-Anwendung mit mehreren Mandanten (eine EdTech-App) mit Ihrem täglichen Tech-Tool erstellt und Sie können dasselbe tun. Was ist eine SaaS-Anwendung mit mehreren Mietern? Mit Multi-Tenant-SaaS-Anwendungen können Sie mehrere Kunden aus einem Sing bedienen

Dieser Artikel zeigt die Frontend -Integration mit einem Backend, das durch die Genehmigung gesichert ist und eine funktionale edtech SaaS -Anwendung unter Verwendung von Next.js. erstellt. Die Frontend erfasst Benutzerberechtigungen zur Steuerung der UI-Sichtbarkeit und stellt sicher, dass API-Anfragen die Rollenbasis einhalten


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

WebStorm-Mac-Version
Nützliche JavaScript-Entwicklungstools

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

EditPlus chinesische Crack-Version
Geringe Größe, Syntaxhervorhebung, unterstützt keine Code-Eingabeaufforderungsfunktion

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

VSCode Windows 64-Bit-Download
Ein kostenloser und leistungsstarker IDE-Editor von Microsoft