Maison > interface Web > js tutoriel > 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
Libérer: 2024-10-20 14:57:29
original
861 Les gens l'ont consulté

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>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">window.setTimeout(()=>{
  res(  console.log("done: " + num)  )
},2000)
Copier après la connexion

})
}

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()
)
Copier après la connexion

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)
Copier après la connexion

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
}
Copier après la connexion

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)
}
Copier après la connexion

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!')
  })
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
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
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal