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

Mary-Kate Olsen
Lepaskan: 2024-10-20 14:57:29
asal
787 orang telah melayarinya

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>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">window.setTimeout(()=>{
  res(  console.log("done: " + num)  )
},2000)
Salin selepas log masuk

})
}

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()
)
Salin selepas log masuk

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)
Salin selepas log masuk

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
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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!')
  })
Salin selepas log masuk

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!

sumber:php
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Cadangan popular
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!