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
Mary-Kate OlsenOriginal
2024-10-20 14:57:29857Durchsuche

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>
<pre class="brush:php;toolbar:false">window.setTimeout(()=>{
  res(  console.log("done: " + num)  )
},2000)

})
}

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()
)

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)

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
}

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)
}

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!')
  })

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!

Stellungnahme:
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