Menakluki Berbilang Pengambilan URL dengan Promise.semua
Dalam bidang pengaturcaraan tak segerak, Promises menawarkan mekanisme yang berkuasa untuk mengendalikan tugas tak segerak seperti mengambil data daripada berbilang URL. Seperti yang anda temui, cuba memasukkan kes penggunaan ini ke dalam paradigma Promise.all boleh menjadi batu penghalang.
Mari kita rungkai penyelesaian percubaan anda:
var promises = urls.map(url => fetch(url)); var texts = []; Promise.all(promises) .then(results => { results.forEach(result => result.text()).then(t => texts.push(t)) })
Kaedah ini mengalami masalah kecacatan penting: forEach tidak mengembalikan tatasusunan mahupun Promise, menjadikan anda dalam kekosongan janji tanpa cara untuk mengakses teks yang diambil.
Untuk membetulkannya, Promise.all mesti digunakan dua kali, sekali untuk mengambil URL dan sekali untuk mengekstrak teks daripada respons:
Promise.all(urls.map(u=>fetch(u))).then(responses => Promise.all(responses.map(res => res.text())) ).then(texts => { … })
Sebagai alternatif, anda boleh menyelaraskan proses dengan menggabungkan pengambilan dan perolehan teks ke dalam satu langkah:
Promise.all(urls.map(url => fetch(url).then(resp => resp.text()) )).then(texts => { … })
Untuk lebih lanjut penyelesaian ringkas, terima kuasa async/waiit:
const texts = await Promise.all(urls.map(async url => { const resp = await fetch(url); return resp.text(); }));
Pendekatan ini memberi anda keupayaan untuk mengendalikan berbilang pengambilan URL dengan cekap, membolehkan anda membina objek yang diingini yang mengandungi teks yang diekstrak.
Atas ialah kandungan terperinci Bagaimana untuk Cekap Mengambil Data daripada Berbilang URL dengan Promise.all?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!