Heim > Web-Frontend > js-Tutorial > Wie übergebe ich Parameter sequentiell durch Versprechen mit Array-Iteration?

Wie übergebe ich Parameter sequentiell durch Versprechen mit Array-Iteration?

Mary-Kate Olsen
Freigeben: 2024-10-20 14:57:29
Original
858 Leute haben es durchsucht

How to Sequentially Pass Parameters through Promises with Array Iteration?

Sequentielle Übergabe von Parametern durch Versprechen mit Array-Iteration

Betrachten Sie die folgende Aufgabe:

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)
Nach dem Login kopieren

})
}

myPromise(myArray[0])
.then(x => myPromise(myArray[1]))
.then(x => myPromise(myArray[2]) )
.then(x => myPromise(myArray[3]))
.then(x => myPromise(myArray[4]))
.then(x => myPromise(myArray [5]))

Code wie oben führt Versprechen nacheinander aus. Wenn das Array jedoch dynamisch gefüllt ist, wird die Ausführung von myPromise() für jedes Mitglied zu einer Herausforderung.

Pausierbare Iteration mit Versprechen

Um eine „pausierbare Schleife“ zu erstellen, die ausgeführt wird myPromise() nacheinander ausführen und auf die Lösung warten, bevor Sie fortfahren:

Fold-Methode

myArray.reduce(
  (p, x) =>
    p.then(() => myPromise(x)),
  Promise.resolve()
)
Nach dem Login kopieren

Diese Methode erstellt so viele Versprechen wie Array-Elemente, ist aber eine gute Lösung, wenn Dies ist akzeptabel.

Asynchrone Funktionsmethode

const forEachSeries = async (iterable, action) => {
  for (const x of iterable) {
    await action(x)
  }
}

forEachSeries(myArray, myPromise)
Nach dem Login kopieren

Asynchrone Funktionen bieten eine besser lesbare und speichereffizientere Lösung.

Sammeln Rückgabewerte

Wenn Sie Rückgabewerte als Array sammeln möchten:

const mapSeries = async (iterable, fn) => {
  const results = []

  for (const x of iterable) {
    results.push(await fn(x))
  }

  return results
}
Nach dem Login kopieren

Oder ohne asynchrone Funktionsunterstützung:

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)
}
Nach dem Login kopieren

Anwendungsbeispiel

Ein ausführbares Snippet mit der forEachSeries-Methode:

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!')
  })
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie übergebe ich Parameter sequentiell durch Versprechen mit Array-Iteration?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage