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