Rumah  >  Artikel  >  hujung hadapan web  >  Bagaimana untuk Mengendalikan Panggilan Fungsi Asynchronous dalam JavaScript For Loops?

Bagaimana untuk Mengendalikan Panggilan Fungsi Asynchronous dalam JavaScript For Loops?

DDD
DDDasal
2024-10-28 03:54:30276semak imbas

How to Handle Asynchronous Function Calls within JavaScript For Loops?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn