Dans ce scénario, vous devez vous assurer que :
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!