Maison > interface Web > js tutoriel > Comment résoudre les promesses JavaScript de manière séquentielle ?

Comment résoudre les promesses JavaScript de manière séquentielle ?

Linda Hamilton
Libérer: 2024-12-13 17:49:15
original
944 Les gens l'ont consulté

How to Resolve JavaScript Promises Sequentially?

​​​​​​​Résoudre les promesses de manière séquentielle

Les promesses sont un moyen courant de gérer les opérations asynchrones en JavaScript. Cependant, il peut être difficile de contrôler l'ordre dans lequel les promesses sont résolues.

Le problème :

Considérez le code suivant qui lit une série de fichiers en série :

var readFile = function(file) {
  ... // Returns a promise.
};

var readFiles = function(files) {
  return new Promise((resolve, reject) => {
    var readSequential = function(index) {
      if (index >= files.length) {
        resolve();
      } else {
        readFile(files[index]).then(function() {
          readSequential(index + 1);
        }).catch(reject);
      }
    };

    readSequential(0); // Start with the first file!
  });
};
Copier après la connexion

Ce code utilise la récursion pour lire les fichiers les uns après les autres, mais il peut être difficile à travailler with.

Éviter la récursion avec Async/Await :

Dans JavaScript moderne, l'utilisation des fonctions async et wait est une solution plus élégante :

async function readFiles(files) {
  for(const file of files) {
    await readFile(file);
  }
};
Copier après la connexion

Vous pouvez également utiliser des itérateurs :

Les générateurs asynchrones offrent une alternative approche de lecture séquentielle des fichiers :

async function* readFiles(files) {
  for(const file of files) {
    yield await readFile(file);
  }
};
Copier après la connexion

Envisagez une boucle simple :

Si vous préférez une approche plus simple, une boucle for de base peut suffire :

var readFiles = function(files) {
  var p = Promise.resolve(); // Q() in q

  files.forEach(file =>
      p = p.then(() => readFile(file)); 
  );
  return p;
};
Copier après la connexion

Ou, utilisez la réduction de promesse :

Une solution plus compacte en utilisant réduire :

var readFiles = function(files) {
  return files.reduce((p, file) => {
     return p.then(() => readFile(file));
  }, Promise.resolve()); // initial
};
Copier après la connexion

Méthodes utilitaires de bibliothèque

Certaines bibliothèques de promesses (par exemple, Bluebird) fournissent des méthodes utilitaires adaptées à cet effet :

var Promise = require("bluebird");
var fs = Promise.promisifyAll(require("fs"));

var readAll = Promise.resolve(files).map(fs.readFileAsync,{concurrency: 1 });
// if the order matters, you can use Promise.each instead and omit concurrency param

readAll.then(function(allFileContents){
    // do stuff to read files.
});
Copier après la connexion

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