Rumah >hujung hadapan web >tutorial js >Bagaimana untuk Melewati Parameter secara Berurutan melalui Janji dengan Lelaran Tatasusunan?
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!