Heim > Web-Frontend > js-Tutorial > Hauptteil

Wie gehe ich mit Promise-Looping in JavaScript ES6 richtig um?

Patricia Arquette
Freigeben: 2024-11-23 21:06:13
Original
536 Leute haben es durchsucht

How to Properly Handle Promise Looping in JavaScript ES6?

JavaScript ES6 Promise Looping

In JavaScript ES6 bieten Versprechen einen Mechanismus für die asynchrone Programmierung. Die Verwendung von Versprechen innerhalb einer for-Schleife stellt jedoch eine Herausforderung dar, da die Synchronität der Schleife zu unerwartetem Verhalten führen kann.

Asynchrone Versprechensverkettung

Um sicherzustellen, dass jedes Versprechen ausgeführt wird Erst nachdem sein Vorgänger aufgelöst wurde, müssen wir die asynchrone Versprechensverkettung implementieren. Dabei wird jedes Versprechen erst dann erstellt, wenn das vorherige aufgelöst wurde.

Versprechenserstellung mit setTimeout()

Um asynchrone Vorgänge zu simulieren, verwenden wir häufig setTimeout(). Damit die Verkettung jedoch effektiv funktioniert, benötigen wir eine Promise-basierte Version von setTimeout(). Hier ist eine Funktion, die setTimeout() verspricht:

const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
Nach dem Login kopieren

Lösungsoptionen

Wenn das versprochene setTimeout() vorhanden ist, stehen mehrere Optionen für die asynchrone Versprechenverkettung innerhalb zur Verfügung eine for-Schleife:

1. for-Schleife mit anfänglichem Versprechen:

Diese Methode verwendet eine for-Schleife, die mit einem sofort auflösenden Versprechen beginnt. Jede Iteration verkettet ein neues Versprechen basierend auf dem Ergebnis des vorherigen.

for (let i = 0, p = Promise.resolve(); i < 10; i++) {
    p = p.then(() => delay(Math.random() * 1000)
         .then(() => console.log(i));
}
Nach dem Login kopieren

2. Array#reduce mit Initial Promise:

Diese Lösung verwendet Array#reduce, um einen Wertebereich zu durchlaufen und Versprechen basierend auf dem Ergebnis jedes Schritts zu erstellen.

const delayAndLog = (acc, i) => acc.then(() => delay(Math.random() * 1000))
         .then(() => console.log(i));

[...Array(10).keys()].reduce(delayAndLog, Promise.resolve());
Nach dem Login kopieren

3. Rekursive Funktion mit Promise-Auflösung:

Diese Methode beinhaltet eine Funktion, die sich selbst innerhalb eines then-Rückrufs aufruft. Jeder Aufruf löst das resultierende Versprechen auf, wenn die nächste Iteration bereit ist.

let i = 0;
const loop = () => delay(Math.random() * 1000)
        .then(() => console.log(i++))
        .then(loop);

loop().then(() => {});
Nach dem Login kopieren

4. async/await (ES2017):

ES2017 führte async/await ein, was prägnanteren asynchronen Code ermöglicht.

async function loop() {
    for (let i = 0; i < 10; i++) {
        await delay(Math.random() * 1000);
        console.log(i);
    }
}

loop();
Nach dem Login kopieren

5. für „await...of“ (ES2020):

ES2020 hat die Syntax für „await...of“ eingeführt, die die asynchrone Iteration vereinfacht.

async function* loop() {
    for (let i of [...Array(10).keys()]) {
        yield await delay(Math.random() * 1000);
    }
}

for await (const i of loop()) {
    console.log(i);
}
Nach dem Login kopieren

Diese Lösungen stellen sicher, dass jedes Versprechen in Die Schleife wird erst ausgeführt, nachdem die vorherige wie gewünscht aufgelöst wurde.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit Promise-Looping in JavaScript ES6 richtig um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage