Die Single-Threaded-Natur von JavaScript/Typescript: Asynchrone Programmierung
In meinem ersten Artikel habe ich über einige Unterschiede zwischen JS und TS geschrieben.
Jetzt werden wir die asynchrone Natur einer Single-Threaded-Sprache untersuchen.
In JavaScript und TypeScript bedeutet die Single-Threaded -Natur, dass jeweils nur eine Aufgabe ausgeführt werden kann.
Andererseits bezieht sich die asynchrone Programmierung auf die Fähigkeit der Sprache, Aufgaben asynchron auszuführen, sodass der Hauptausführungsthread weiter ausgeführt werden kann, während er auf den Abschluss anderer Aufgaben wartet. Dies wird durch die Verwendung von Rückrufen , Ereignissen , Versprechen und Async / Await erreicht .
Bevor ich anfange, diese in Bezug auf die Codierung zu erklären, möchte ich über einen sehr interessanten Hinweis sprechen, wie asynchrone Aufgaben einer Single-Threaded-Sprache unserem Gehirn sehr ähnlich sind, wenn wir versuchen, Multitasking durchzuführen .
In diesem Abschnitt werde ich einen langen Text/ein langes Kapitel von Kyle Simpson in seinem Buch „You Dont Know Javascript“ über den Zusammenhang von Sequential Brain mit Asynchronisation zusammenfassen. Wenn Sie sich nur für den Codierungsteil und dessen Funktionsweise interessieren, können Sie diesen Teil überspringen.
„ Ich bin mir ziemlich sicher, dass die meisten von Ihnen schon einmal jemanden sagen hören (und es sogar selbst behauptet haben): „ Ich bin ein Multitasker.“ „
Aber sind wir Multitasker? Können wir wirklich zwei bewusste, absichtliche Handlungen gleichzeitig ausführen und genau im selben Moment über beide nachdenken/überlegen? Ist auf unserer höchsten Ebene der Gehirnfunktionalität paralleles Multithreading im Gange?
Die Antwort wird Sie vielleicht überraschen: Wahrscheinlich nicht.
Unser Gehirn scheint einfach nicht so aufgebaut zu sein. Wir sind viel mehr Einzelunternehmer, als viele von uns zugeben möchten. Eigentlich können wir zu jedem Zeitpunkt nur an eine Sache denken.
Ich spreche nicht von all unseren unwillkürlichen, unbewussten, automatischen Gehirnfunktionen wie Herzschlag, Atmung und Augenlidzwinkern. Das sind alles lebenswichtige Aufgaben für unser nachhaltiges Leben, aber wir weisen ihnen nicht absichtlich Gehirnleistung zu.“
Laut Simpson sind Menschen nicht in der Lage, wirklich Multitasking auf die gleiche Weise zu betreiben wie ein Computer. Zwar kann das menschliche Gehirn mehrere Aufgaben gleichzeitig verarbeiten, es ist jedoch nicht in der Lage, allen Aufgaben gleichzeitig die gleiche Aufmerksamkeit zu widmen. Stattdessen wechseln wir unsere Aufmerksamkeit schnell zwischen Aufgaben, ähnlich wie ein einzelnes Thread-Programm jeweils nur eine Aufgabe ausführen kann.
Zum Glück erledigt unser Gehirn im Hintergrund (Threads!) all diese wichtigen Aufgaben, während wir zum 15. Mal in drei Minuten damit beschäftigt sind, die Feeds sozialer Netzwerke zu überprüfen.
Wenn wir Multitasking vortäuschen, also beispielsweise versuchen, etwas einzugeben, während wir gleichzeitig mit einem Freund oder Familienmitglied telefonieren, agieren wir höchstwahrscheinlich als schnelle Kontextwechsler . Mit anderen Worten: Wir wechseln schnell hintereinander zwischen zwei oder mehr Aufgaben hin und her und bearbeiten jede Aufgabe gleichzeitig in winzigen, schnellen kleinen Abschnitten. Wir machen das so schnell, dass es für die Außenwelt so aussieht, als würden wir diese Dinge parallel tun.
Klingt das für Sie nach asynchroner ereignisgesteuerter Parallelität (genau wie das, was in JS passiert)?!
Es gibt einen großen, beobachtbaren Unterschied zwischen der Art und Weise, wie wir verschiedene Aufgaben planen, und der Art und Weise, wie unser Gehirn diese Aufgaben tatsächlich ausführt.
Obwohl unser Gehirn auf operativer Ebene asynchrone Ereignisse aufweist, scheinen wir Aufgaben auf sequentielle und synchrone Weise zu planen. „Ich muss in den Laden gehen, dann etwas Milch kaufen und dann meine chemische Reinigung abgeben.“
Können Sie sich tatsächlich vorstellen, eine Denkweise zu haben, die Ihre Erledigungen so plant:
„ Ich muss in den Laden (1), aber unterwegs bekomme ich sicher einen Anruf (2) , also ‚Hallo Mama‘, und während sie anfängt zu reden, schaue ich auf Die Geschäftsadresse (3) auf GPS, aber das Laden dauert eine Sekunde, also stelle ich das Radio (4) leiser , damit ich Mama besser hören kann …
dann wird mir klar, dass ich vergessen habe, eine Jacke anzuziehen ( 5) und es ist kalt draußen, aber egal, fahren Sie weiter und reden Sie mit Mama …
und dann erinnert mich das Geräusch des Sicherheitsgurts daran, mich anzuschnallen (6) , also „Ja, Mama, ich trage meinen Sicherheitsgurt, das tue ich immer!“. Ah, endlich:
Das GPS hat jetzt die Wegbeschreibung erhalten …“
So lächerlich die Formulierung dafür klingt, wie wir unseren Tag planen und darüber nachdenken, was wir in welcher Reihenfolge tun sollen, so funktioniert unser Gehirn auf funktioneller Ebene genau so. Aber denken Sie daran, das ist kein Multitasking, sondern nur ein schneller Kontextwechsel.
Schauen wir uns vor diesem Hintergrund genauer an, wie die asynchrone Programmierung in JavaScript funktioniert.
Nun zum Codieren :
Es gibt mehrere Möglichkeiten, asynchrone Programmierung in JavaScript/Typescript durchzuführen, wie ich am Anfang dieses Artikels erwähnt habe, einschließlich der Verwendung von: Callbacks , Events, Promises, Async/Await.
- Ein Callback ist eine Funktion, die als Argument an eine andere Funktion übergeben und ausgeführt wird, nachdem die äußere Funktion abgeschlossen ist. Zum Beispiel:
function greet(name, callback) {
console.log(`Hello, ${name}!`);
callback();
}
function sayGoodbye() {
console.log("Goodbye!");
}
greet("John", sayGoodbye);
// Output: "Hello, John!"
// Output: "Goodbye!"
const button = document.querySelector("button");
button.addEventListener("click", () => {
console.log("Button was clicked!");
});
Versprechen können verwendet werden, um den Prozess der Verkettung asynchroner Vorgänge zu vereinfachen. Zum Beispiel:
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Completed Async Task");
}, 1000);
});
promise.then((result) => {
console.log(result);
});
// Output: "Async task completed" (after 1 second)
async function greet(name) {
return `Hello, ${name}!`;
}
async function main() {
const greeting = await greet("John");
console.log(greeting);
}
main();
// Output: "Hello, John!"
Insgesamt ermöglicht die asynchrone Programmierung die Ausführung mehrerer Aufgaben unter Beibehaltung des Single-Thread-Charakters der Sprache. Es ermöglicht ein reaktionsschnelleres und effizienteres Programm, indem es dem Hauptthread ermöglicht, weiterzulaufen, während er auf den Abschluss anderer Aufgaben wartet.
Wenn Ihnen dieser Inhalt gefällt, zögern Sie nicht, ihm zu folgen. Es liegen noch viele weitere Projekte vor, über die ich in naher Zukunft schreiben möchte. Bis dann,
Vielen Dank fürs Lesen!

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































