【发布时间】:2014-05-12 21:06:27
【问题描述】:
今天发生了我见过的最奇怪的事情之一。 我在页面中有一个循环,它为循环的每个元素执行同步 ajax 请求。由于花费的时间太长,我决定通过刷新页面来停止循环。
当页面加载时,我无法单击页面的任何元素,所以我检查了 Firebug 控制台,我看到前一个循环的 ajax 调用仍在完成(循环设置为在我单击后开始链接,因此它无法在页面加载后立即启动)。 要停止循环,我必须关闭当前标签并在新标签中打开我的页面。
值得一提的是,我在该页面上有一个数据表,并且我启用了保存表状态的选项,这可能会干扰我的代码(循环本身不是数据表初始化的一部分,尽管它使用数据表)。
我还注意到循环中的某些事情没有完成。它应该不时更改数据表的页面,并且应该在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;
}
});
我不希望这种行为发生,但我不知道为什么会发生以及如何防止它发生
【问题讨论】:
-
这不太可能是您看到所见的原因。如果您在哪里提供简化的案例,有人可能会提供帮助。
-
我已经发布了包含循环的代码
-
表面上看起来是正确的。一个 firbug 错误将在我的嫌疑人名单上。甚至可能是一个 Firefox 错误。不过,你的方法是错误的。请求应该是异步的。我只使用
async: false进行原型设计。 -
这个循环可能会在 100k 或更多的数据集上调用,除非有办法将 ajax 调用排队而不是一次全部执行(我承认我从未寻找过),如果我不这样做t 使用 async: false 浏览器(甚至服务器)可能会冻结或崩溃。但我担心排队 ajax 调用会遇到与我现在遇到的问题相同的问题
-
我可能会补充一点,这是 Firefox 上的行为(准确地说是 Pale Moon),我刚刚在 Chrome 上尝试了该页面:在这种情况下,如果我单击刷新脚本继续运行,但页面如果我单击刷新按钮,则根本不会刷新。
标签: javascript ajax datatables refresh