clearINterval和范围

这里有一些间隔的问题。

基本的结论是我有一个进度条function,每行1个,从后端脚本输入信息。 我在一个间隔内每5秒ping一次这个脚本到ajax调用。

这是有效的,但是有倍数问题(即,第二个进度条调用相同的function)或当项目“关闭”(div幻灯片)时它应该停止。 这是一些非常复杂的代码,所以我会尽力提取必要的部分,但请注意,尽管如此,这可能不会运行。

一个完整的步行虽然 – function名称已被更改,以保护无辜:)

onlcick,div打开,并调用此启动函数:

function start(ID){ var request = $.ajax({ url: "script?DO=Start&ID="+ID , type: "GET" , cache: false , dataType: "text" }); request.done(function(msg) { startLoop(ID); }); request.fail(function(jqXHR, textStatus) { //alert("Request failed: " + textStatus ); }); } 

正如您所看到的,这会调用startLoop fnc,它继续ping更新信息脚本(getInfo())以获取信息:

 function startLoop(ID){ var i = setInterval(function(){ var xstatus = getInfo(ID); //other stufff that works if(xstatus=="done"){ clearInterval(i); } }, 5000); } 

这个和它的自我工作正常。

如果第二次单击事件打开第二个窗口,它只有一个新ID并调用相同的函数。

因此,我有一个i间隔,并且摧毁一个似乎停止一切。 我应该将i转换为对象,例如i.ID吗?

此外,当停止时,我有一个onclick = stop()调用,并且从循环外部,我似乎无法阻止它。

我如何重新安排它以使其工作?

它应支持1个或多个同步项目的启动,停止和自动更新。

为什么不使用setTimeout而不是clearInterval ,因为你已经负责在其回调中杀死区间:

 // using this approach might require changing the name of this function function startLoop(ID) { setTimeout(function(){ var xstatus = getInfo(ID); //other stufff that works if(xstatus!=="done"){ startLoop(ID); // do it all over again if it's not complete } }, 5000); } 

这会给你相同的行为,但有一些额外的奖金。 首先,这不应该导致你的其他工作在完成后被杀死。 另一个是这将异步运行,所以如果请求开始花费超过5秒完成,超时将不会再次ping它5秒钟,而不是每隔5秒盲目触发,无论是否请求已完成。