Maison  >  Article  >  interface Web  >  Comment garantir l'exécution synchrone du code basé sur les promesses dans une boucle ?

Comment garantir l'exécution synchrone du code basé sur les promesses dans une boucle ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 19:22:30278parcourir

How to Ensure Synchronous Execution of Promise-Based Code in a Loop?

Trouver la structure de boucle correcte pour garantir que le code basé sur les promesses s'exécute de manière synchrone

Lorsque vous travaillez avec du code basé sur des promesses, la structure de boucle correcte est essentiel pour garantir l’exécution synchrone des opérations asynchrones. Dans le scénario donné, l'objectif est de construire une boucle qui assure l'exécution de "db.getUser(email).then(function(res) { logger.log(res); })" dans le bon ordre lors de chaque itération.

Une approche utilise une fonction "promiseWhile" personnalisée. Bien que cette méthode puisse être utile pour des scénarios généraux, elle introduit une complexité inutile pour le cas spécifique en question. Au lieu de cela, une solution plus simple consiste à exploiter les fonctions intégrées de manipulation de tableaux telles que map() et réduire().

Promesses parallèles ou série

Le problème réside dans l'obligation de conserver l'ordre des réponses, ce qui élimine l'utilisation d'une approche parallèle via Array.prototype.map(). Pour construire la chaîne de promesse souhaitée avec un ordre préservé, Array.prototype.reduce() est plus adapté.

Exemple :

function fetchUserDetails(arr) {
    return arr.reduce(function(promise, email) {
        return promise.then(function() {
            return db.getUser(email).done(function(res) {
                logger.log(res);
            });
        });
    }, Promise.resolve());
}

En utilisant cette méthode, l'exécution du fichier "db. getUser" est garanti en série, garantissant que l'ordre des résultats est maintenu. Le code peut être appelé comme suit :

var arrayOfEmailAddys = [...];

fetchUserDetails(arrayOfEmailAddys).then(function() {
    console.log('all done');
});

Cette approche élimine le besoin de boucles ou de conditions complexes et garantit la bonne exécution de la chaîne de promesses, même lorsqu'il s'agit d'opérations asynchrones.

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!

Déclaration:
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