Rumah >hujung hadapan web >tutorial js >Bagaimana untuk Melewati Parameter secara Berurutan melalui Janji dengan Lelaran Tatasusunan?

Bagaimana untuk Melewati Parameter secara Berurutan melalui Janji dengan Lelaran Tatasusunan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-20 14:57:29861semak imbas

How to Sequentially Pass Parameters through Promises with Array Iteration?

Melalui Parameter Secara Berurutan melalui Janji dengan Lelaran Tatasusunan

Pertimbangkan tugas berikut:

var myArray = [1, 2, 3, 4, 5, 6]</p>
<p>fungsi myPromise(num){<br> kembalikan 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]) )
.kemudian(x => MyPromise(myArray[3]))
.then(x => MyPromise(myArray[4]))
.then(x => myPromise(myArray [5]))

Kod seperti di atas akan melaksanakan janji secara berurutan. Walau bagaimanapun, jika tatasusunan diisi secara dinamik, melaksanakan myPromise() untuk setiap ahli menjadi mencabar.

Lelaran Boleh Jeda dengan Janji

Untuk mencipta "gelung boleh jeda" yang melaksanakan myPromise() secara berurutan, menunggu penyelesaian sebelum meneruskan:

Kaedah Lipat

myArray.reduce(
  (p, x) =>
    p.then(() => myPromise(x)),
  Promise.resolve()
)

Kaedah ini mencipta banyak janji sebagai elemen tatasusunan, tetapi ia adalah penyelesaian yang kemas jika ini boleh diterima.

Kaedah Fungsi Async

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

forEachSeries(myArray, myPromise)

Fungsi Async menawarkan penyelesaian yang lebih mudah dibaca dan cekap memori.

Mengumpul Nilai Pulangan

Jika anda ingin mengumpul nilai pulangan sebagai tatasusunan:

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

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

  return results
}

Atau, tanpa sokongan fungsi async:

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

Contoh Penggunaan

Coretan boleh jalan menggunakan kaedah 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!')
  })

Atas ialah kandungan terperinci Bagaimana untuk Melewati Parameter secara Berurutan melalui Janji dengan Lelaran Tatasusunan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn