Heim > Artikel > Web-Frontend > Erfahren Sie mehr über asynchrone Programmierung in Node.js und teilen Sie vier Lösungen
Wenn es asynchrone E/A gibt, muss es asynchrone Programmierung geben! Lernen wir noch heute die asynchrone Programmierung in Node.js!
Unter dem Einfluss synchroner E/A gelang es dem vorherigen Single-Thread-Modell aufgrund langsamer E/A-Aufrufe nicht, CPU und E/A auf Anwendungsebene zu überlappen. Um den Lese- und Denkgewohnheiten von Programmierern Rechnung zu tragen, erfreut sich synchrones I/O seit vielen Jahren großer Beliebtheit. [Empfohlenes Lernen: „nodejs-Tutorial“]
Aber es gibt große Leistungsprobleme!
Node verwendet JavaScript und seine interne asynchrone Bibliothek, um die Asynchronität direkt auf die Geschäftsebene zu heben. Das größte Feature von Node ist das ereignisgesteuerte, nicht blockierende I/O-Modell. Nicht blockierende E/A können verhindern, dass CPU und E/A aufeinander warten, wodurch Ressourcen besser genutzt werden können.
Zweck: Lesen Sie den Dateiinhalt, der dem Hauptfeld in package.json entspricht.
Rückruf
Verwenden Sie Rückruffunktionen, um asynchrone E/A-Vorgänge auszuführen
Frage: Wie löst man die Rückrufhölle?
Promise
Promise ist eine endliche Zustandsmaschine mit vier Zuständen, von denen die drei Kernzustände Ausstehend (suspendiert), Erfüllt ( Abgeschlossen), Abgelehnt (abgelehnt) und es gibt auch einen nicht gestarteten ZustandWeitere Informationen finden Sie in meinem vorherigen Blog-BeitragEine vorläufige Studie zu Promise
Verwenden Sie Promise, um den Dateiinhalt zu lesen, der dem Hauptinhalt entspricht Feld in package.jsonconst fs = require("fs"); fs.readFile("./package.json", { encoding: "utf-8" }, (err, data) => { if (err) throw err; const { main } = JSON.parse(data); fs.readFile(main, { encoding: "utf-8" }, (err, data) => { if (err) throw err; console.log(data); }); });Wenn wir die vorherige Lösung mit Callback vergleichen, können wir sehen, dass es keine verschachtelten Rückrufe gibt und asynchrone Vorgänge über eine Reihe verketteter Aufrufe abgewickelt werden.
Callback to Promise
Wie konvertiert man das Callback-to-Promise-Formular? Sie können die Node-eigene Toolfunktion util.promisify verwendenSie können sie selbst implementieren:const { readFile } = require("fs/promises"); readFile("./package.json", { encoding: "utf-8" }) .then((res) => { return JSON.parse(res); }) .then((data) => { return readFile(data.main, { encoding: "utf-8" }); }) .then((res) => { console.log(res); });
await
await-Funktion verwendet Try Catch, um Ausnahmen abzufangen (achten Sie auf Parallelverarbeitung)function promisify(fn, receiver) { return (...args) => { return new Promise((resolve, reject) => { fn.apply(receiver, [ ...args, (err, res) => { return err ? reject(err) : resolve(res); }, ]); }); }; } const readFilePromise = promisify(fs.readFile, fs);awaits Syntax wird geschrieben Genau wie bei der synchronen Programmierung ist die Operation hier eine
serielleOperation, die Zeile für Zeile auf die Ausführung wartet.
Wenn mehrere Aufgabenparallel sein können, wäre es nicht gut, so zu schreiben. Das heißt, wir können Promise.all verwenden, um parallele Aufgaben auszuführen
Hier wird es auch eine kleine Frage geben, die ich dem Lehrer nach dem Unterricht gestellt habe, und dies ist die Antwort des Lehrers [Q] Im asynchronen Teil: Sagen wir: Bezüglich serieller und paralleler Verarbeitung habe ich eine Frage zur parallelen Verarbeitung. Wenn das parallele Szenario erfordert, dass jede asynchrone Aufgabe ausgeführt werden muss, unabhängig davon, ob andere Aufgaben erfolgreich sind oder fehlschlagen, und Fehler schließlich einheitlich behandelt werden müssen, tritt bei der Verwendung von Promise.all zur Verarbeitung mehrerer asynchroner Aufgaben der erste Aufgabenausführungsfehler auf zurückgegeben, wenn das Ergebnis. Wenn eine Anfrage fehlschlägt, wird der Fehler sofort zurückgewiesen, daher können wir Promise.all nicht verwenden, um dies umzusetzen. Promise verfügt über eine allSettled-Methode,developer.mozilla.org/en-US/docs/…
EventVeröffentlichungs- und Abonnementmodus, Node.js integriertes Ereignismodul
wie HTTP-Ereignis Überwachungconst { readFile } = require("fs/promises"); const start = async () => { const { main } = JSON.parse( await readFile("./package.json", { encoding: "utf-8" }) ); const data = await readFile(main, { encoding: "utf-8" }); console.log(data); }; start();
server on('request')
Originaladresse: https://juejin.cn/post/7005509871000895524
Autor: YK BacteriaWeitere Kenntnisse zum Thema Programmierung finden Sie unter: Programmiervideos! !
Das obige ist der detaillierte Inhalt vonErfahren Sie mehr über asynchrone Programmierung in Node.js und teilen Sie vier Lösungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!