ホームページ >ウェブフロントエンド >jsチュートリアル >配列の反復を使用して Promise を通じてパラメーターを連続的に渡すにはどうすればよいですか?
配列の反復による Promise を介してパラメータを連続的に渡す
次のタスクを考えてみましょう:
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]))
上記のようなコードは、Promise を順番に実行します。ただし、配列が動的に設定される場合、メンバーごとに myPromise() を実行するのは困難になります。
Promise を使用した一時停止可能な反復
を実行する「一時停止可能なループ」を作成するにはmyPromise() を順番に実行し、続行する前に解決を待ちます:
Fold メソッド
myArray.reduce( (p, x) => p.then(() => myPromise(x)), Promise.resolve() )
このメソッドは配列要素と同じ数の Promise を作成しますが、次の場合には適切な解決策です。これは許容されます。
非同期関数メソッド
const forEachSeries = async (iterable, action) => { for (const x of iterable) { await action(x) } } forEachSeries(myArray, myPromise)
非同期関数は、より読みやすくメモリ効率の高いソリューションを提供します。
収集戻り値
戻り値を配列として収集する場合:
const mapSeries = async (iterable, fn) => { const results = [] for (const x of iterable) { results.push(await fn(x)) } return results }
または、非同期関数のサポートなし:
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) }
使用例
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!') })
以上が配列の反復を使用して Promise を通じてパラメーターを連続的に渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。