ホームページ >ウェブフロントエンド >jsチュートリアル >配列の反復を使用して Promise を通じてパラメーターを連続的に渡すにはどうすればよいですか?

配列の反復を使用して Promise を通じてパラメーターを連続的に渡すにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-20 14:57:29855ブラウズ

How to Sequentially Pass Parameters through Promises with Array Iteration?

配列の反復による 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。