2014-04-01 68 views
1

今天,我曾经见过的最奇怪的事情之一发生了。 我在页面中有一个循环,为循环的每个元素执行同步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; 
     } 

}); 

我不希望这种行为发生,但我有它的原因,以及如何防止它

+1

这不可能是你看到你所看到的原因。如果你在哪里提供减少的案例,有人可能会提供帮助。 – sabof

+0

我发布了包含循环的代码 – valepu

+0

表面上它看起来是正确的。我的嫌疑犯名单上会出现一个蝙蝠虫。甚至可能是Firefox的错误。但是,你的方法是错误的。这些请求应该是异步的。我只用'async:false'进行原型设计。 – sabof

回答

0

我已经加入一个变量,将停止循环,当我退出页面解决:

var stopLoop=false 
$(window).unload(function() { 
    stopLoop=true; 
}); 

两个环路现在会检查该变量是在执行循环内的代码之前假。 这适用于Firefox,但不适用于Chrome。

- 编辑 -

最后我已经通过编辑代码,以使AJAX异步调用和使用回调函数继续循环,尽管人们并没有简单的任务得到解决(有些日子后来我发现了一个新的解决方案,当我发现如何恢复数据表使用的参数来检索数据时,我可以在一次调用中完成所需的所有工作,但这与原始问题无关)。因此,为了将来的参考:当用ajax同步调用进行循环时,期待这种“奇怪”的行为

0

感谢不知道分享你的故事。我在帖子中没有看到任何具体问题,所以我只想评论一下我的感受。

据我所知,浏览器不需要重画UI ,而 JavaScript正在运行。由于在同步ajax请求上存在脚本阻塞,也许可以预料,直到循环结束,才会看到对表的更改。

此外,也可能是浏览器在脚本运行时不需要销毁页面。这可以解释为什么刷新页面后在Firebug中看到请求 - 也许以前的页面副本仍处于隐藏状态。

编辑:valepu在下面的评论中报告,在脚本运行时,表格会发生变化。没关系。浏览器可能会确定它可以在ajax调用期间重新绘制UI(这不会影响JavaScript环境)。 valepu还澄清说,刷新页面后,视觉更新停止,但请求继续消失。这与浏览器刚刚隐藏前一页(直到完成)并在刷新时加载页面的新副本的想法一致。

至于如何防止它:最可靠的方法是使用异步请求,否则在请求之间产生。对不起,伙计们。

+0

“问题”是我不希望发生这种行为,但我不知道为什么会发生这种情况,以及如何防止它发生。当我点击启动循环的按钮后,脚本正在运行时,我看到表更改(和console.log消息),在刷新页面后,我仍然看到ajax调用(既调用了数据表页,又调用了数据表页在循环中的呼叫),但我没有看到控制台消息,也没有更新表。 – valepu

+0

谢谢,我会编辑我的答案 – guest

相关问题