Pertama sekali, jarang masalah ini berlaku kerana terlalu banyak penyelesaian yang lebih baik. Apabila melakukan Ajax hari ini, perkara yang menarik ialah permintaan dapatkan mesti dihantar dalam setiap lelaran Kerana kelajuan lelaran terlalu pantas, lelaran seterusnya akan dijalankan sebelum permintaan selesai, kecuali yang terakhir satu Kecuali permintaan itu, semua permintaan lain telah dibatalkan. Jadi apa yang perlu dilakukan? Tetapkan kelewatan (tidak begitu baik) atau cara lain?
Terdapat banyak cara, seperti menetapkan tidur, lelaran, dll. Saya menggunakan dua penyelesaian lain.
1. Permintaan ajax segerak dan permintaan ajax adalah tak segerak secara lalai, jadi permintaan itu hendaklah ditetapkan kepada palsu.
function creatXMLHttpRequest() { var xmlHttp; if (window.ActiveXObject) { return xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } else if (window.XMLHttpRequest) { return xmlHttp = new XMLHttpRequest(); } } function disButton(name, actionName, resquestParmName) { var path = document.getElementById("path").value; var xmlHttp = creatXMLHttpRequest(); var invoiceIds = new Array(); invoiceIds = document.getElementsByName(name); // 迭代的速度快于发送请求+收到回复的时间 所以一次get请求都还没有完成就进行了下一次请求 for (i = 0; i < invoiceIds.length; i++) { var invoiceId = invoiceIds[i].value; var url = path + "/" + actionName + ".action?" + resquestParmName + "=" + invoiceId; xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4) { if (xmlHttp.status == 200) { var result = xmlHttp.responseText; if (result == "0") { document.getElementById("btn" + invoiceId).disabled = "disabled"; } } } } xmlHttp.open("GET", url, false); xmlHttp.send(null); } }
Dengan cara ini, menggunakan permintaan ajax segerak, anda akan menunggu pelayan bertindak balas, melaksanakan kod dan kemudian meneruskan lelaran. Tetapi nampaknya ini tidak disyorkan.
2. Gunakan kaedah tak segerak , tetapi ingat bahawa objek XMLHttpRequest baharu mesti dibuat untuk setiap lelaran dan tidak boleh digunakan semula.
function creatXMLHttpRequest() { var xmlHttp; if (window.ActiveXObject) { return xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } else if (window.XMLHttpRequest) { return xmlHttp = new XMLHttpRequest(); } } function disButton(name, actionName, resquestParmName) { var xmlHttp; var path = document.getElementById("path").value; var invoiceIds = new Array(); invoiceIds = document.getElementsByName(name); // 迭代的速度快于发送请求+收到回复的时间 所以一次get请求都还没有完成就进行了下一次请求 for (i = 0; i < invoiceIds.length; i++) { xmlHttp = creatXMLHttpRequest(); var invoiceId = invoiceIds[i].value; var url = path + "/" + actionName + ".action?" + resquestParmName + "=" + invoiceId; fu(xmlHttp,url,invoiceId); } } function fu(xmlHttp,url,invoiceId){ xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4) { if (xmlHttp.status == 200) { var result = xmlHttp.responseText; if (result == "0") { document.getElementById("btn" + invoiceId).disabled = "disabled"; } } } } // xmlHttp.open("GET", url, true); xmlHttp.send(null); }
Memandangkan gelung JS for dan ajax dijalankan secara tidak segerak, gelung for tamat tetapi ajax masih belum dilaksanakan. Jika permintaan tak segerak digunakan, jika XMLHttpRequest baharu dibuat setiap lelaran, setiap permintaan boleh dilengkapkan, tetapi hasilnya masih tidak tepat dan beberapa atur cara belum dilaksanakan.
Faham, ternyata setiap lelaran adalah untuk melaksanakan beberapa baris kod Kod untuk menghantar permintaan asynchronous ajax harus diletakkan dalam fungsi, dan fungsi ini harus dipanggil setiap lelaran.
Dari segi prestasi, Untuk permintaan ajax berulang ini, nampaknya kaedah segerak mempunyai prestasi yang lebih tinggi.
Masalah ini telah diselesaikan dan pemahaman saya tentang ajax dan http telah diperdalam.
Di atas memperkenalkan masalah menghantar permintaan AJAX dalam gelung JavaScript. Saya harap ia akan membantu rakan-rakan yang berminat dengan tutorial Javascript.