Invokasi Fungsi Asynchronous dalam For Loops dalam JavaScript
Sifat tak segerak JavaScript boleh menimbulkan cabaran apabila menggunakan fungsi tak segerak dalam untuk gelung. Pertimbangkan kod berikut:
for(var i = 0; i < list.length; i++){ mc_cli.get(list[i], function(err, response) { do_something(i); }); }
Isunya terletak pada fungsi panggil balik tak segerak, yang mungkin dilaksanakan selepas gelung for selesai. Akibatnya, do_something(i) akan sentiasa merujuk lelaran akhir gelung.
Percubaan Penyelesaian dengan Penutupan
Pemaju cuba menggunakan penutupan untuk menangkap nilai i dalam setiap lelaran gelung:
do_something((function(x){return x})(i))
Walau bagaimanapun, pendekatan ini juga gagal kerana fungsi tersebut dilaksanakan serta-merta, mengakibatkan isu yang sama.
Penyelesaian Menggunakan forEach
Penyelesaian yang lebih cekap ialah menggunakan kaedah JavaScript forEach, yang menyediakan item tatasusunan dan indeksnya kepada fungsi panggil balik. Memandangkan setiap panggilan balik mempunyai skopnya sendiri, nilai indeks dikekalkan.
list.forEach(function(listItem, index){ mc_cli.get(listItem, function(err, response) { do_something(index); }); });
Dengan menggunakan forEach, fungsi panggil balik kini mempunyai akses kepada nilai indeks yang betul untuk setiap lelaran, menyelesaikan isu indeks yang salah sedang dirujuk dalam fungsi do_something.
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Panggilan Fungsi Asynchronous dalam JavaScript For Loops?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!