Maison  >  Article  >  interface Web  >  Comment exécuter une séquence de promesses dans l'ordre et gérer les refus ?

Comment exécuter une séquence de promesses dans l'ordre et gérer les refus ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-24 13:18:11932parcourir

How to Execute a Sequence of Promises in Order and Handle Rejections?

Comment synchroniser une séquence de promesses

Dans ce scénario, vous devez vous assurer que :

  • Les promesses sont résolues de la même manière ordre dans lequel ils sont répertoriés dans le tableau.
  • Si un élément est rejeté, la séquence entière doit rejeter.

Bien qu'il n'existe pas de solution intégrée directe pour cela, voici des moyens d'obtenir ce comportement :

Itération manuelle utilisant la récursion :

function sequence(arr) {
  const index = 0;

  function next() {
    if (index < arr.length) {
      arr[index]().then(next).catch(reject);
      index++;
    }
  }
  next();
}

Utilisation Réduire :

function sequence(arr) {
  return arr.reduce((p, item) => {
    return p.then(() => item()); // Assuming each element is a promise-returning function
  }, Promise.resolve());
}

Utilisation de Promise.mapSeries :

Si vous utilisez la bibliothèque Bluebird Promise, vous pouvez utiliser sa méthode Promise.mapSeries :

function sequence(arr) {
  return Promise.mapSeries(arr, item => item());
}

Utiliser ES7 Async/Await :

Si pris en charge, vous pouvez utiliser async/await pour y parvenir :

async function sequence(arr) {
  const results = [];
  for (let item of arr) {
    results.push(await item());
  }
  return results;
}

Utilisation de la bibliothèque spex :

La bibliothèque spex fournit une méthode de séquence qui vous permet de parcourir une séquence de dynamiques promesses :

import { sequence } from 'spex';

function sequence(nextPromise) {
  // while nextPromise() creates and returns another promise, continue resolving it;
}

N'oubliez pas que si un élément du tableau est rejeté, la séquence sera rejetée dès que ce rejet est rencontré. Ce comportement garantit que d'autres éléments ne sont pas traités.

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