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秒盲目触发,无论是否请求已完成。