今天,我曾经见过的最奇怪的事情之一发生了。 我在页面中有一个循环,为循环的每个元素执行同步ajax请求。由于它耗时太长,我决定通过刷新页面来停止循环。Javascript - 循环在页面刷新后继续运行
当页面加载我无法点击页面的任何元素,所以我检查了Firebug控制台,我看到前一个循环的ajax调用仍在完成(循环设置为在我点击后启动一个链接,所以无法在页面加载时立即启动)。 要停止循环,我必须关闭当前选项卡并打开新页面。
值得一提的是,我在那个页面上有一个datatables表,我已经启用了保存表状态的选项,也许这是干扰我的代码(循环本身不是数据表初始化的一部分,尽管它使用来自表格的数据)。
我也注意到循环的一些内容没有完成。它应该不时地改变了数据表的页面,并且它应该写在JavaScript控制台中,这两件事情在我刷新页面后都不会发生,但ajax调用仍在继续。
这里就是循环包含的代码:
//This variable will contain a reference to the datatable
var oTable;
var isWorking=false;
//Change the datatables page
function changeTablePage(oTable, page, clear){
if(clear){
oTable.fnClearTable();
oTable.fnDraw();
}
oTable.fnPageChange(page);
}
//This part is inside a document.ready block
$(document).on("click", ".validation-all-click", function(event){
if(!isWorking){
isWorking=true;
//saves the current page, will be needed for later
var page=oTable.fnPagingInfo().iPage;
var numberPage=0;
var done=false;
while(!done){
console.log("page: "+numberPage);
changeTablePage(oTable, numberPage, false);
var nNodes = oTable.fnGetNodes();
var len=nNodes.length;
$('.validation-click', nNodes).each(function(index, value){
//id of the element to be validated
var id=$(value).data("rowid");
//Calls the validation url
$.ajax({
url: "/validate?id="+id,
async: false
});
});
//if the datatables page has 0 items, then it's done
if(len==0){
done=true;
}
numberPage++;
}
//goes back to the original page
changeTablePage(oTable, page, true);
isWorking=false;
}
});
我不希望这种行为发生,但我有它的原因,以及如何防止它
这不可能是你看到你所看到的原因。如果你在哪里提供减少的案例,有人可能会提供帮助。 – sabof
我发布了包含循环的代码 – valepu
表面上它看起来是正确的。我的嫌疑犯名单上会出现一个蝙蝠虫。甚至可能是Firefox的错误。但是,你的方法是错误的。这些请求应该是异步的。我只用'async:false'进行原型设计。 – sabof