Node.js Asynchronous Programming Callback Einführung (1)_node.js
Node.js basiert auf der JavaScript-Engine v8 und ist Single-Threaded. Node.js verwendet asynchrone Programmiermethoden ähnlich wie JavaScript im Web, um blockierende E/A-Vorgänge zu verarbeiten. Das Lesen von Dateien, der Zugriff auf Datenbanken, Netzwerkanfragen usw. in Node.js können alle asynchron sein. Für Node.js-Neulinge oder Entwickler, die mit einem anderen Sprachhintergrund auf Node.js umsteigen, ist die asynchrone Programmierung ein schmerzhafter Teil. In diesem Kapitel werden Sie in alle Aspekte der asynchronen Programmierung mit Node.j eingeführt, von den einfachsten bis hin zu den tieferen. Vom einfachsten Rückruf über Thunk, Promise, Co bis hin zu Async/Await, das für ES7 geplant ist.
Beginnen wir zunächst mit einem konkreten Beispiel der asynchronen Programmierung.
Wetterinformationen für mehrere IP-Standorte abrufen
In der Datei ip.json gibt es ein Array, in dem wir mehrere IP-Adressen speichern, die von verschiedenen Besuchern stammen. Der Inhalt ist wie folgt:
// ip.json
["115.29.230.208", "180.153.132.38", "74.125.235.224", "91.239.201.98", "60.28.215.115"]
Ich hoffe, dass ich für jeden IP-Standort das aktuelle Wetter abrufen kann. Geben Sie die Ergebnisse in der Datei „wetter.json“ im folgenden Format aus:
// Weather.json
[
{ "ip": "115.29.230.208", "weather": "Clouds", "region": "Zhejiang" },
{ "ip": "180.153.132.38", "weather": "Clear", "region": "Shanghai" },
{ "ip": "74.125.235.224", "weather": "Rain", "region": "California" },
{ "ip": "60.28.215.115", "weather": "Clear", "region": "Tianjin" }
]
Um unsere Gedanken zu ordnen, unterteilen wir es in die folgenden Schritte:
1. Lesen Sie die IP-Adresse
2. Ermitteln Sie den geografischen Standort der IP anhand der IP-Adresse
3. Überprüfen Sie das lokale Wetter anhand des geografischen Standorts
4. Schreiben Sie die Ergebnisse in die Datei Weather.json.
Diese Schritte sind alle asynchron (das Lesen und Schreiben von Dateien kann synchron sein, aber als Beispiel wird asynchron verwendet).
Zuerst versuchen wir, es so zu implementieren, wie es die Node.js-API normalerweise vorsieht – indem wir einen Rückruf als asynchronen Rückruf übergeben, ohne eine Bibliothek zu verwenden. Wir werden drei Grundmodule verwenden:
1.fs: Lesen Sie die IP-Liste aus der Datei ip.json; schreiben Sie das Ergebnis in die Datei
2.Anfrage: Wird zum Senden von HTTP-Anfragen, zum Abrufen von Geodaten basierend auf der IP-Adresse und zum anschließenden Abrufen von Wetterdaten über Geodaten verwendet 3.Abfragezeichenfolge: Wird zum Zusammenstellen der URL-Parameter zum Senden von Anforderungen verwendet.
Erstellen Sie eine neue callback.js-Datei und führen Sie diese Module ein:
var qs = require('querystring')
Lesen Sie die IP-Liste in der Datei, rufen Sie fs.readFile auf, um den Dateiinhalt zu lesen, und verwenden Sie dann JSON.parse, um die JSON-Daten zu analysieren:
Wenn (irrt) {
Rückruf(err)
} sonst {
Versuchen Sie es mit {
data = JSON.parse(data)
Callback(null, data)
} Catch (Fehler) {
Rückruf (Fehler)
}
}
})
}
...
Der nächste Schritt besteht darin, IP zu verwenden, um Geo zu erhalten. Wir verwenden request, um einen offenen Geodienst anzufordern:
Anfrage({
URL: URL,
json: true
}, function(err, resp, body) {
callback(err, body)
})
}
...
Verwenden Sie Geodaten, um das Wetter zu erhalten:
...
Funktion geo2weather(lat, lon, callback) {
var params = {
lat: lat,
lon: lon,
APPID: '9bf4d2b07c7ddeb780c5b32e636c679d'
}
var url = 'http://api.openweathermap.org/data/2.5/weather?' qs.stringify(params)
Anfrage({
URL: URL,
json: wahr,
}, function(err, resp, body) {
callback(err, body)
})
}
...
Nachdem wir nun die Schnittstellen für Geo und Wetter erhalten haben, müssen wir uns noch mit einem etwas komplizierteren Problem befassen. Da es mehrere IPs gibt, müssen wir Geodaten parallel lesen und Wetterdaten parallel lesen:
...
Funktion ips2geos(ips, callback) {
var geos = []
var ip
var bleibt = ips.length
for (var i = 0; i < ips.length; i ) {
ip = ips[i];
(Funktion(ip) {
ip2geo(ip, function(err, geo) {
Wenn (irrt) {
Rückruf(err)
} sonst {
geo.ip = ip
geos.push(geo)
bleiben--
}
Wenn (bleib == 0) {
Callback(null, geos)
}
})
})(ip)
}
}
Funktion geos2weathers(geos, callback) {
var Weathers = []
var geo
var bleibt = geos.length
for (var i = 0; i < geos.length; i ) {
Geo = geos[i];
(Funktion(geo) {
geo2weather(geo.latitude, geo.longitude, function(err, Weather) {
Wenn (irrt) {
Rückruf(err)
} sonst {
Weather.geo = geo
Weather.push(Wetter)
bleiben--
}
Wenn (bleib == 0) {
Callback(null, Weathers)
}
})
})(geo)
}
}
...
Sowohl ips2geos als auch geos2weathers verwenden die relativ primitive Methode „Reit“, um die Anzahl der Elemente zu berechnen, die auf die Rückgabe warten. Wenn „Remain“ 0 ist, bedeutet dies, dass die parallele Anforderung beendet ist und die Verarbeitungsergebnisse in ein Array geladen und zurückgegeben werden .
Der letzte Schritt besteht darin, die Ergebnisse in die Datei Weather.json zu schreiben:
...
Funktion writeWeather(Wetter, Rückruf) {
var-Ausgabe = []
Var-Wetter
for (var i = 0; i < Weathers.length; i ) {
Weather = Weathers[i]
Output.push({
IP: Weather.geo.ip,
Wetter: Weather.weather[0].main,
Region: Weather.geo.region
})
}
fs.writeFile('./weather.json', JSON.stringify(output, null, ' '), callback)
}
...
Durch die Kombination der oben genannten Funktionen können wir unser Ziel erreichen:
...
Funktion handlerError(err) {
console.log('error: ' err)
}
readIP('./ip.json', function(err, ips) {
if (irr) {
handlerError(err)
} sonst {
ips2geos(ips, function(err, geos) {
if (irr) {
handlerError(err)
} sonst {
geos2weathers(geos, function(err, Weathers) {
if (irr) {
handlerError(err)
} sonst {
writeWeather(weathers, function(err) {
if (irr) {
handlerError(err)
} sonst {
console.log('success!')
}
})
}
})
}
})
}
})
哈哈, 你妈这嵌套, 你可能觉得这就是 JavaScript 异步的问题, 说真的, 嵌套不是 JavaScript. 异步的真正问题所在。上面这段代码我们可以下面这样写:
...
Funktion ReadIPCallback(err, ips) {
if (irr) {
handlerError(err)
} sonst {
ips2geos(ips, ips2geosCallback)
}
}
Funktion ips2geosCallback(err, geos) {
if (irr) {
handlerError(err)
} sonst {
geos2weathers(geos, geos2weathersCallback)
}
}
Funktion geos2weathersCallback(ähm, Wetter) {
if (irr) {
handlerError(err)
} sonst {
writeWeather(Wetter, writeWeatherCallback)
}
}
Funktion writeWeatherCallback(err) {
if (irr) {
handlerError(err)
} sonst {
console.log('success!')
}
}
readIP('./ip.json', ReadIPCallback)
好了,这是我们 callback.js 的全部内容。运行:
Knoten callback.js
将会生成wetter.json 文件:
[
{
„ip“: „180.153.132.38“,
„Wetter“: „Klar“,
„Region“: „Shanghai“
},
{
„ip“: „91.239.201.98“,
„Wetter“: „Wolken“
},
{
„ip“: „60.28.215.115“,
„Wetter“: „Klar“,
„Region“: „Tianjin“
},
{
„ip“: „74.125.235.224“,
„Wetter“: „Wolken“,
„Region“: „Kalifornien“
},
{
„ip“: „115.29.230.208“,
„Wetter“: „Klar“,
„Region“: „Zhejiang“
}
]
Was ist dann das eigentliche Problem?
Natürlich handelt es sich um ein asynchrones Problem, bei dem es im Wesentlichen um drei Dinge geht:
1. Wenn der asynchrone Vorgang endet, muss eine Rückrufbenachrichtigung erfolgen
2. Die asynchron generierten Ergebnisse müssen zurückgesendet werden. Der Rückruf akzeptiert einen Datenparameter und gibt die Daten zurück
3. Was soll ich tun, wenn ein asynchroner Fehler auftritt? Callback akzeptiert einen Fehlerparameter und gibt den Fehler zurück.
Aber haben Sie viele sich wiederholende Arbeiten (verschiedene Rückrufe) festgestellt? Stimmt etwas mit dem obigen Code nicht? Bitte freuen Sie sich auf die Fortsetzung dieses Artikels.

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

Zusammenfassung: Asynchrone Programmierung in C++ ermöglicht Multitasking, ohne auf zeitaufwändige Vorgänge warten zu müssen. Verwenden Sie Funktionszeiger, um Zeiger auf Funktionen zu erstellen. Die Rückruffunktion wird aufgerufen, wenn der asynchrone Vorgang abgeschlossen ist. Bibliotheken wie boost::asio bieten asynchrone Programmierunterstützung. Der Praxisfall zeigt, wie man mit Funktionszeigern und boost::asio asynchrone Netzwerkanfragen umsetzt.

Asynchrone Programmierung mit JavaScript-Funktionen: Grundlegende Fähigkeiten zur Bewältigung komplexer Aufgaben Einführung: In der modernen Frontend-Entwicklung ist die Bewältigung komplexer Aufgaben zu einem unverzichtbaren Bestandteil geworden. Asynchrone Programmierkenntnisse in JavaScript-Funktionen sind der Schlüssel zur Lösung dieser komplexen Aufgaben. In diesem Artikel werden die grundlegenden Konzepte und gängigen praktischen Methoden der asynchronen Programmierung von JavaScript-Funktionen vorgestellt und spezifische Codebeispiele bereitgestellt, um den Lesern zu helfen, diese Techniken besser zu verstehen und zu verwenden. 1. Grundkonzepte der asynchronen Programmierung Bei der traditionellen synchronen Programmierung ist der Code

Da Webanwendungen immer komplexer werden, sind Programmierer gezwungen, asynchrone Programmierung zu übernehmen, um eine große Anzahl von Anforderungen und E/A-Vorgängen zu verarbeiten. PHP: HypertextPreprocessor ist keine Ausnahme. Um diesem Bedarf gerecht zu werden, hat sich ReactPHP zu einem der beliebtesten asynchronen Programmierframeworks für PHP entwickelt. In diesem Artikel besprechen wir, wie man mit ReactPHP asynchrone Programmierung in PHP durchführt. 1. Einführung in ReactPHP ReactPHP ist eine ereignisgesteuerte Programmierung

So implementieren Sie die asynchrone Nachrichtenverarbeitung in PHP Einführung: In modernen Webanwendungen wird die asynchrone Nachrichtenverarbeitung immer wichtiger. Die asynchrone Nachrichtenverarbeitung kann die Leistung und Skalierbarkeit des Systems verbessern und das Benutzererlebnis verbessern. Als häufig verwendete serverseitige Programmiersprache kann PHP durch einige Technologien auch die asynchrone Nachrichtenverarbeitung implementieren. In diesem Artikel stellen wir einige Methoden zur Implementierung der asynchronen Nachrichtenverarbeitung in PHP vor und stellen Codebeispiele bereit. Verwenden von Message Queuing Message Queuing ist eine Möglichkeit, Systemkomponenten zu entkoppeln, sodass verschiedene Komponenten dies tun können

Vertiefendes Verständnis der neuen Funktionen von PHP8: Wie nutzt man asynchrone Programmierung und Code effizient? PHP8 ist die neueste Hauptversion der Programmiersprache PHP und bringt viele aufregende neue Funktionen und Verbesserungen mit sich. Eines der herausragendsten Features ist die Unterstützung der asynchronen Programmierung. Durch asynchrone Programmierung können wir die Leistung und Reaktionsfähigkeit bei gleichzeitigen Aufgaben verbessern. In diesem Artikel werfen wir einen detaillierten Blick auf die asynchronen Programmierfunktionen von PHP8 und stellen vor, wie man sie effizient nutzt. Lassen Sie uns zunächst verstehen, was asynchrone Programmierung ist. Im traditionellen synchronen Programmiermodell folgt der Code einer linearen Sequenz

3 häufige Probleme und Lösungen bei der asynchronen Programmierung in Java-Frameworks: Callback Hell: Verwenden Sie Promise oder CompletableFuture, um Callbacks intuitiver zu verwalten. Ressourcenkonflikt: Verwenden Sie Synchronisierungsprimitive (z. B. Sperren), um gemeinsam genutzte Ressourcen zu schützen, und erwägen Sie die Verwendung threadsicherer Sammlungen (z. B. ConcurrentHashMap). Nicht behandelte Ausnahmen: Behandeln Sie Ausnahmen in Aufgaben explizit und verwenden Sie ein Ausnahmebehandlungs-Framework (z. B. CompletableFuture.exclusionally()), um Ausnahmen zu behandeln.

Das Go-Framework nutzt die Parallelitäts- und Asynchronitätsfunktionen von Go, um einen Mechanismus zur effizienten Abwicklung gleichzeitiger und asynchroner Aufgaben bereitzustellen: 1. Parallelität wird durch Goroutine erreicht, sodass mehrere Aufgaben gleichzeitig ausgeführt werden können. 2. Asynchrone Programmierung wird über Kanäle implementiert kann ausgeführt werden, ohne den Hauptthread zu blockieren. Geeignet für praktische Szenarien wie die gleichzeitige Verarbeitung von HTTP-Anfragen, die asynchrone Erfassung von Datenbankdaten usw.

1. Warum asynchrone Programmierung verwenden? Bei der herkömmlichen Programmierung werden I/O-Vorgänge blockiert. Das bedeutet, dass das Programm auf den Abschluss eines Vorgangs wartet, bevor es fortfährt. Dies kann für eine einzelne Aufgabe gut funktionieren, kann jedoch dazu führen, dass das Programm bei der Verarbeitung einer großen Anzahl von Aufgaben langsamer wird. Die asynchrone Programmierung durchbricht die Einschränkungen herkömmlicher blockierender E/A und verwendet nicht blockierende E/A. Dies bedeutet, dass das Programm Aufgaben zur Ausführung auf verschiedene Threads oder Ereignisschleifen verteilen kann, ohne auf den Abschluss der Aufgabe warten zu müssen. Dadurch kann das Programm mehrere Aufgaben gleichzeitig bearbeiten und so die Leistung und Effizienz des Programms verbessern. 2. Die Grundlage der asynchronen Python-Programmierung Die Grundlage der asynchronen Python-Programmierung sind Coroutinen und Ereignisschleifen. Coroutinen sind Funktionen, die es einer Funktion ermöglichen, zwischen Anhalten und Wiederaufnehmen zu wechseln. Die Ereignisschleife ist für die Planung verantwortlich
