Transmission séquentielle de paramètres via des promesses avec itération de tableau
Considérez la tâche suivante :
var myArray = [1, 2, 3, 4, 5, 6]</p> <p>function myPromise(num){<br> return new Promise(res => {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">window.setTimeout(()=>{ res( console.log("done: " + num) ) },2000)
})
}
maPromesse(monArray[0])
.then(x => maPromesse(monArray[1]))
.then(x => maPromesse(monArray[2]) )
.then(x => maPromesse(monArray[3]))
.then(x => maPromesse(monArray[4]))
.then(x => maPromesse(monArray [5]))
Un code comme celui ci-dessus exécutera les promesses de manière séquentielle. Cependant, si le tableau est rempli dynamiquement, l'exécution de myPromise() pour chaque membre devient difficile.
Itération pauseable avec promesses
Pour créer une "boucle pauseable" qui s'exécute myPromise() séquentiellement, en attendant la résolution avant de continuer :
Méthode Fold
myArray.reduce( (p, x) => p.then(() => myPromise(x)), Promise.resolve() )
Cette méthode crée autant de promesses que d'éléments du tableau, mais c'est une solution intéressante si c'est acceptable.
Méthode de fonction asynchrone
const forEachSeries = async (iterable, action) => { for (const x of iterable) { await action(x) } } forEachSeries(myArray, myPromise)
Les fonctions asynchrones offrent une solution plus lisible et plus efficace en mémoire.
Collecte Valeurs de retour
Si vous souhaitez collecter les valeurs de retour sous forme de tableau :
const mapSeries = async (iterable, fn) => { const results = [] for (const x of iterable) { results.push(await fn(x)) } return results }
Ou, sans prise en charge des fonctions asynchrones :
const mapSeries = (iterable, fn) => { const iterator = iterable[Symbol.iterator]() const results = [] const go = () => { const {value, done} = iterator.next() if (done) { return results } return fn(value).then(mapped => { results.push(mapped) return go() }) } return Promise.resolve().then(go) }
Exemple d'utilisation
Un extrait exécutable utilisant la méthode forEachSeries :
const myArray = [1, 2, 3, 4, 5, 6] const sleep = ms => new Promise(res => { setTimeout(res, ms) }) const myPromise = num => sleep(500).then(() => { console.log('done: ' + num) }) const forEachSeries = async (iterable, action) => { for (const x of iterable) { await action(x) } } forEachSeries(myArray, myPromise) .then(() => { console.log('all done!') })
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!