Pemprosesan Asynchronous dalam JavaScript untuk Gelung: Mengekalkan Nilai Lelaran Gelung
Dalam pengaturcaraan tak segerak, operasi dimulakan dan meneruskan pelaksanaannya secara bebas daripada benang utama. Ini boleh membawa kepada isu apabila cuba menyegerakkan hasil operasi tak segerak dengan kemajuan aliran kawalan segerak, seperti gelung untuk.
Pertimbangkan untuk gelung berikut:
let i; let j = 10; for (i = 0; i < j; i++) { asynchronousProcess(callbackFunction() { alert(i); }); }
Objetivo adalah untuk memaparkan satu siri makluman yang menunjukkan nombor 0 hingga 10. Walau bagaimanapun, disebabkan sifat tak segerak fungsi asynchronousProcess, fungsi panggil balik dicetuskan selepas gelung menyelesaikan beberapa lelaran. Akibatnya, nilai amaran tidak dipaparkan dalam susunan yang dimaksudkan.
Penyelesaian: Menggunakan Penutupan Fungsi untuk Menangkap Nilai Gelung
Untuk menangani isu ini, adalah perlu untuk memastikan bahawa setiap lelaran gelung mempunyai nilai unik i apabila fungsi panggil balik dipanggil. Ini boleh dicapai dengan menangkap pembolehubah gelung dalam penutupan fungsi.
Ini boleh dicapai menggunakan IIFE (Ungkapan Fungsi Segera Dipanggil):
for (var i = 0; i < j; i++) { (function(cntr) { asynchronousProcess(function() { alert(cntr); }); })(i); }
Dalam contoh ini, nilai i dihantar ke IIFE sebagai cntr, dan penutupan fungsi memastikan bahawa setiap lelaran mempunyai nilai uniknya sendiri i.
Sebagai alternatif, anda boleh mencipta fungsi luaran yang menerima pembolehubah gelung sebagai parameter:
function logIndex(index) { console.log(index); } for (var i = 0; i < j; i++) { asynchronousProcess(logIndex.bind(null, i)); }
Menggunakan ES6 let Variable Declaration
Dengan pengenalan ES6, adalah mungkin untuk mengisytiharkan pembolehubah gelung menggunakan let, yang mencipta pembolehubah berskop blok. Ini menyediakan cara yang mudah untuk memastikan setiap lelaran gelung mempunyai nilai uniknya sendiri iaitu i:
for (let i = 0; i < j; i++) { asynchronousProcess(function() { alert(i); }); }
Nota:
Adalah penting untuk ambil perhatian bahawa setiap penyelesaian ini mencipta salinan pembolehubah gelung pada masa penutupan fungsi atau pengisytiharan pembolehubah. Jika pembolehubah gelung diubah suai selepas operasi tak segerak selesai, salinan ini tidak akan mencerminkan nilai yang dikemas kini.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghalang Operasi Tak Segerak daripada Mengganggu Nilai Lelaran Gelung dalam JavaScript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!