Heim >Web-Frontend >js-Tutorial >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:
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:
Verwenden Sie Geodaten, um das Wetter zu erhalten:
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:
Durch die Kombination der oben genannten Funktionen können wir unser Ziel erreichen:
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 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 的全部内容。运行:
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.