


Mengendalikan operasi asynchronous dengan cekap dan pengumpulan data dalam gelung di JavaScript
Memahami cabaran operasi tak segerak dalam gelung
Di JavaScript, kita sering menghadapi cabaran apabila kita perlu melakukan operasi tak segerak di dalam gelung (mis., Panggil fungsi yang mengembalikan janji) dan akhirnya mengumpul hasil semua operasi ini. Corak ralat biasa cuba mengumpul data dalam janji. Kemudian () panggil balik di dalam gelung dan mengharapkan untuk mengembalikan data ini dengan segera selepas gelung berakhir.
Pertimbangkan senario berikut: Kami mempunyai senarai pesanan yang perlu mendapatkan alamat e -mel mereka untuk pembeli setiap pesanan. MyListOrsFunction () dan MyGetMemberFunction () adalah kedua -dua fungsi asynchronous yang kembali janji.
const myListOrdersFunction = memerlukan ('backend/test'). myListordersFunction; const mygetMemberFunction = memerlukan ('backend/getMember'). MyGetMemberFunction; $ w.onready (fungsi () { const emaillist = myListOrsFunction () .THEN (LISTEDODERS => { const loginemails = []; untuk (perintah const of listedorders) { // Masalahnya terletak: MyGetMemberFunction mengembalikan janji, // Hasilnya hanya boleh digunakan selepas gelung berakhir MyGetMemberFunction (order.buyer.memberid) .THEN (Ahli => { loginemails.push (member.LogImail); }) .catch (error => { Console.error ("gagal mendapatkan maklumat ahli:", ralat); }); } // Pada masa ini, loginemail mungkin kosong, kerana janji dalaman belum diselesaikan kembali loginemails; }) .catch (error => { Console.error ("gagal mendapatkan senarai pesanan:", ralat); }); // Kod berikutnya cuba mengakses emaillist, tetapi mungkin janji yang tidak dapat diselesaikan, // atau mungkin walaupun ia diselesaikan, ia mungkin mengandungi array kosong. const printeMails = async () => { const a = menunggu emaillist; console.log ("a", a); // "a []" mungkin output } printeMails (); });
Masalah dengan kod di atas ialah untuk ... gelung dilaksanakan secara serentak. Apabila gelung dilaksanakan ke MyGetMemberFunction (order.buyer.memberid) .tua (...), ia hanya memulakan operasi tak segerak dan mendaftarkan fungsi panggil balik, dan tidak menunggu operasi tak segerak selesai. Oleh itu, apabila gelung selesai, kembali Loginemails; Barisan kod ini akan dilaksanakan dengan serta -merta, dan array Loginemails mungkin masih kosong pada masa ini, kerana semua janji yang dikembalikan oleh MyGetMemberFunction masih menunggu di latar belakang untuk diselesaikan. Pada akhirnya, apabila janji emaillist diselesaikan, nilainya akan menjadi array kosong.
Penyelesaian: Async/menunggu dengan janji.all
Untuk mengendalikan senario ini dengan betul, kita memerlukan mekanisme untuk menunggu semua operasi tak segerak dalam gelung untuk diselesaikan sebelum mengumpul hasilnya secara seragam. Sintaks async/menunggu yang digabungkan dengan janji. Kaedah semua adalah amalan terbaik untuk menyelesaikan masalah ini.
- Async/menunggu : Menyediakan cara yang lebih segerak dan boleh dibaca untuk menulis kod asynchronous, mengelakkan bersarang yang mendalam. THEN () Callbacks.
- Janji.All : Menerima pelbagai janji dan mengembalikan janji baru. Janji baru ini akan diselesaikan selepas semua janji input diselesaikan, dan nilai resolusinya adalah array yang mengandungi semua nilai resolusi janji input (perintah itu selaras dengan perintah janji input). Sekiranya ada janji input gagal, janji yang dikembalikan oleh janji. Semua juga akan gagal dengan segera.
Berikut adalah penyelesaian yang dioptimumkan menggunakan async/menunggu dan janji. Semua:
const myListOrdersFunction = memerlukan ('backend/test'). myListordersFunction; const mygetMemberFunction = memerlukan ('backend/getMember'). MyGetMemberFunction; // pastikan fungsi $ w.onready adalah fungsi async supaya menunggu digunakan di dalamnya $ w.onready (fungsi async () { Cuba { // 1. Tunggu untuk mendapatkan senarai pesanan Const ListedOrders = menunggu MyListOrdersFunction (); // 2. Tukar ID Ahli setiap pesanan kepada janji yang memperoleh maklumat ahli // Gunakan peta untuk melintasi penyenaraian, buat janji myGetMemberfunction untuk setiap pesanan. Const MemberPromises = listedOrders.map (order => MyGetMemberFunction (order.buyer.memberid) ); // 3. Gunakan Janji.All untuk menunggu semua maklumat ahli untuk diambil // Janji.All akan mengembalikan array yang mengandungi semua objek anggota ahli const = menunggu janji.All (AhliPromises); // 4. Ekstrak semua alamat e -mel dari array objek ahli loginemails = ahli.map (ahli => ahli.loginemail); // 5. Kini Loginemail mengandungi peti mel semua ahli, dan anda boleh melakukan Operasi seterusnya Console.log ("Semua peti mel yang dikumpulkan:", Loginemails); // Dengan mengandaikan ini adalah pengendali tindak balas API, anda boleh mengembalikannya: // kembali ok ({ // "E -mel": Loginemails //}); } menangkap (ralat) { // Unifiedly mengendalikan kemungkinan kesilapan konsol.error ("Ralat berlaku semasa pemprosesan:", ralat); // Dengan mengandaikan ini adalah pengendali tindak balas API, anda boleh mengembalikan ralat seperti ini: // Return ServerError (ralat); } });
Penjelasan kod terperinci
- $ w.onready (fungsi async () {...}); : Mengisytiharkan fungsi panggil balik Onready sebagai async supaya kita dapat menggunakan kata kunci menunggu di dalamnya.
- const listedorders = menunggu myListOrsFunction (); : Kata kunci menunggu akan berhenti pelaksanaan fungsi async semasa sehingga janji yang dikembalikan oleh myListOrsFunction () diselesaikan. Setelah diselesaikan, hasilnya (senarai pesanan) diberikan kepada penyenaraian.
- const MemberPromises = listedOrders.map (order => myGetMemberFunction (order.buyer.memberId)); : Ini adalah langkah utama. Kami menggunakan kaedah array.prototype.map () untuk melangkah ke atas array penyenaraian. Untuk setiap pesanan, kami memanggil MyGetMemberFunction (order.buyer.memberid). Perhatikan bahawa kami tidak menggunakan menunggu di sini kerana kami mahu panggilan myGetMemberfunction ini akan dilaksanakan secara serentak , dan bukannya secara serentak dilaksanakan satu demi satu. Kaedah peta akhirnya akan mengembalikan pelbagai janji yang dikembalikan oleh semua myGetMemberfunction.
- ahli const = menunggu janji.All (AhliPromises); : Menunggu Janji.All (MemberPromises) akan berhenti pelaksanaan fungsi async sehingga semua janji dalam pelbagai Profromises diselesaikan. Apabila mereka semua diselesaikan, janji. Semua mengembalikan array baru yang mengandungi nilai resolusi setiap janji (iaitu, setiap objek ahli), dan perintah array baru ini selaras dengan perintah janji dalam array anggota.
- const loginemails = ahli.map (ahli => ahli.loginemail); : Sekarang kita mempunyai pelbagai ahli yang mengandungi semua objek ahli, kita boleh menggunakan kaedah peta sekali lagi untuk dengan mudah mengekstrak loginemail semua ahli daripadanya dan dapatkan array loginemail akhir.
- Pengendalian ralat (cuba ... menangkap) : Async/menunggu membuat ralat mengendalikan lebih intuitif. Mana -mana janji yang ditunggu -tunggu dalam fungsi async ditolak, ia akan ditangkap oleh cubaan ... menangkap blok, sama seperti pengecualian dalam kod segerak. Ini adalah ringkas daripada mengendalikan kesilapan dalam setiap .then (). Tangkap () rantai.
Nota dan amalan terbaik
- Concurrency : Kelebihan utama janji. Semua adalah bahawa ia dapat melaksanakan pelbagai janji secara serentak. Ini bermakna semua permintaan untuk mendapatkan maklumat ahli dikeluarkan hampir serentak, dan bukannya menghantar yang seterusnya selepas satu permintaan selesai, yang sangat meningkatkan kecekapan.
- Pengendalian Ralat : Janji.Ada adalah "semua atau tidak ada". Jika mana -mana janji dalam janji. Semua ditolak, janji yang dikembalikan oleh janji. Semua juga akan ditolak dengan segera dan hanya akan mengembalikan sebab pertama penolakan. Sekiranya anda perlu mengumpulkan semua hasil yang berjaya walaupun terdapat kegagalan separa, pertimbangkan untuk menggunakan janji.
- Pertimbangan Prestasi : Jika pelbagai penyenaraian sangat besar (contohnya, beribu -ribu), dan memulakan sejumlah besar permintaan rangkaian pada masa yang sama boleh menyebabkan tekanan pada pelayan atau menyebabkan limpahan memori penyemak imbas. Dalam kes ini, anda mungkin perlu melaksanakan had keserasian (contohnya, menggunakan P-Limit atau Baris Janji Kustom) untuk mengawal bilangan permintaan yang dibuat serentak.
- Kebolehbacaan : Async/Await sangat meningkatkan kebolehbacaan dan penyelenggaraan kod tak segerak, menjadikannya lebih dekat dengan aliran logik kod segerak.
Meringkaskan
Async/menunggu digabungkan dengan janji. Semua adalah corak yang kuat dan elegan ketika mengendalikan operasi tak segerak di dalam gelung dan mengumpul hasil dalam JavaScript. Ia bukan sahaja menyelesaikan keadaan perlumbaan dan ketidaksempurnaan data yang boleh menyebabkan rantaian janji tradisional, tetapi juga meningkatkan kebolehbacaan kod dan kemudahan pengendalian ralat melalui sintaks yang lebih jelas. Menguasai corak ini adalah penting untuk menulis kod asynchronous JavaScript moden yang cekap dan mantap.
Atas ialah kandungan terperinci Mengendalikan operasi asynchronous dengan cekap dan pengumpulan data dalam gelung di JavaScript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Stock Market GPT
Penyelidikan pelaburan dikuasakan AI untuk keputusan yang lebih bijak

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Artikel ini akan memperkenalkan cara menggunakan JavaScript untuk mencapai kesan mengklik pada imej. Idea teras adalah menggunakan atribut data HTML5 untuk menyimpan laluan imej alternatif, dan mendengar klik acara melalui JavaScript, secara dinamik menukar atribut SRC, dengan itu menyedari penukaran imej. Artikel ini akan memberikan contoh dan penjelasan kod terperinci untuk membantu anda memahami dan menguasai kesan interaktif yang biasa digunakan ini.

Pertama, periksa sama ada penyemak imbas menyokong GeolocationAPI. Jika disokong, hubungi getCurrentPosition () untuk mendapatkan koordinat lokasi semasa pengguna, dan dapatkan nilai latitud dan longitud melalui panggilan balik yang berjaya. Pada masa yang sama, berikan pengecualian pengendalian panggilan balik ralat seperti kebenaran penafian, ketiadaan lokasi atau tamat masa. Anda juga boleh lulus dalam pilihan konfigurasi untuk membolehkan ketepatan yang tinggi, menetapkan tempoh masa dan tempoh kesahihan cache. Seluruh proses memerlukan kebenaran pengguna dan pengendalian ralat yang sepadan.

Untuk membuat selang pengulangan dalam JavaScript, anda perlu menggunakan fungsi setInterval (), yang akan berulang kali melaksanakan fungsi atau blok kod pada selang milisaat tertentu. Sebagai contoh, setInterval (() => {console.log ("melaksanakan setiap 2 saat");}, 2000) akan mengeluarkan mesej setiap 2 saat sehingga dibersihkan oleh ClearInterval (intervalid). Ia boleh digunakan dalam aplikasi sebenar untuk mengemas kini jam, pelayan pengundian, dan lain -lain, tetapi memberi perhatian kepada had kelewatan minimum dan kesan masa pelaksanaan fungsi, dan membersihkan selang waktu ketika tidak lagi diperlukan untuk mengelakkan kebocoran ingatan. Terutama sebelum pemotongan komponen atau penutupan halaman, pastikan bahawa

Penggunaan teras API komposisi NUXT3 termasuk: 1. DefinePagemeta digunakan untuk menentukan maklumat meta halaman, seperti tajuk, susun atur dan middleware, yang perlu dipanggil terus di dalamnya dan tidak boleh diletakkan dalam pernyataan bersyarat; 2. Usehead digunakan untuk menguruskan tag header halaman, menyokong kemas kini statik dan responsif, dan perlu bekerjasama dengan DefinePagemeta untuk mencapai pengoptimuman SEO; 3. UseasyncData digunakan untuk mendapatkan data asynchronous secara selamat, secara automatik mengendalikan status pemuatan dan ralat, dan menyokong kawalan pemerolehan data pelayan dan klien; 4. UseFetch adalah enkapsulasi useasyncdata dan $ ambil, yang secara automatik memasuki kunci permintaan untuk mengelakkan permintaan pendua

Artikel ini bertujuan untuk menyelesaikan masalah kembali null apabila mendapatkan unsur -unsur DOM melalui document.getElementById () dalam JavaScript. Inti adalah untuk memahami masa pelaksanaan skrip dan status parsing DOM. Dengan betul meletakkan tag atau menggunakan acara domcontentloaded, anda dapat memastikan bahawa elemen itu dicuba lagi apabila ia tersedia, dengan berkesan mengelakkan kesilapan tersebut.

Tutorial ini menerangkan secara terperinci bagaimana untuk memformat nombor ke dalam rentetan dengan dua perpuluhan tetap dalam JavaScript, walaupun bilangan bulat boleh dipaparkan dalam bentuk "#.00". Kami akan memberi tumpuan kepada penggunaan number.Prototype.TOfixed (), termasuk sintaksnya, fungsi, kod sampel, dan mata utama yang perlu diperhatikan, seperti jenis pulangannya sentiasa menjadi rentetan.

Gunakan kaedah WriteText Clipboardapi untuk menyalin teks ke papan klip, ia perlu dipanggil dalam konteks keselamatan dan interaksi pengguna, menyokong penyemak imbas moden, dan versi lama boleh diturunkan dengan execcommand.

TheBestatorreateamulti-LinestringinjavascriptsisingSisisingTemplatalAlalSwithBackTticks, yangPreserveticks, whoPreserverekeandeexactlyaswritten.
