Maison  >  Article  >  interface Web  >  Comment transmettre séquentiellement des paramètres via des promesses avec une itération de tableau ?

Comment transmettre séquentiellement des paramètres via des promesses avec une itération de tableau ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-20 14:57:29789parcourir

How to Sequentially Pass Parameters through Promises with Array Iteration?

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>
<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!

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