Maison > interface Web > js tutoriel > le corps du texte

Comment gérer correctement la boucle de promesse dans JavaScript ES6 ?

Patricia Arquette
Libérer: 2024-11-23 21:06:13
original
560 Les gens l'ont consulté

How to Properly Handle Promise Looping in JavaScript ES6?

JavaScript ES6 Promise Looping

Dans JavaScript ES6, les promesses offrent un mécanisme de programmation asynchrone. Cependant, utiliser des promesses dans une boucle for présente un défi, car la nature synchrone de la boucle peut conduire à un comportement inattendu.

Chaînage de promesses asynchrones

Pour garantir que chaque promesse s'exécute ce n'est qu'une fois son prédécesseur résolu que nous devons implémenter un chaînage de promesses asynchrone. Cela implique de créer chaque promesse uniquement lorsque la précédente est résolue.

Création de promesse avec setTimeout()

Pour simuler des opérations asynchrones, nous utilisons souvent setTimeout(). Cependant, pour que le chaînage fonctionne efficacement, nous avons besoin d’une version de setTimeout() basée sur Promise. Voici une fonction qui promet setTimeout() :

const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
Copier après la connexion

Options de solution

Avec la promesse setTimeout() en place, plusieurs options sont disponibles pour le chaînage de promesses asynchrones dans une boucle for :

1. Boucle for avec promesse initiale :

Cette méthode utilise une boucle for qui commence par une promesse à résolution immédiate. Chaque itération enchaîne une nouvelle promesse basée sur le résultat de la précédente.

for (let i = 0, p = Promise.resolve(); i < 10; i++) {
    p = p.then(() => delay(Math.random() * 1000)
         .then(() => console.log(i));
}
Copier après la connexion

2. Array#reduce avec promesse initiale :

Cette solution utilise Array#reduce pour parcourir une plage de valeurs et créer des promesses basées sur le résultat de chaque étape.

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

[...Array(10).keys()].reduce(delayAndLog, Promise.resolve());
Copier après la connexion

3. Fonction récursive avec résolution promise :

Cette méthode implique une fonction qui s'appelle elle-même dans un rappel then. Chaque appel résout la promesse résultante lorsque la prochaine itération est prête.

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

loop().then(() => {});
Copier après la connexion

4. async/await (ES2017) :

ES2017 a introduit async/await, qui permet un code asynchrone plus concis.

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

loop();
Copier après la connexion

5. for wait...of (ES2020) :

ES2020 introduit pour wait...of la syntaxe, qui simplifie l'itération asynchrone.

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);
}
Copier après la connexion

Ces solutions garantissent que chaque promesse dans la boucle ne s'exécute qu'après que la précédente a été résolue, comme souhaité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal