2013-02-20 50 views
1

此处存在一些间隔问题。clearINterval和范围

基本concpt是,我有一个进度条功能,1元的东西行,是从后端脚本馈信息。我在一段时间内每5秒钟对该脚本执行ping ajax调用。

这个工作,但也有以倍数(即第2个进度条调用相同的功能),或者当项目被“关闭”(一个div幻灯片),应立即停止问题。这是一些非常相互关联的代码,所以我会尽我所能提取必要的部分,但请注意,现在它可能不会运行。

一个完整的步行though-函数名称已更改为保护无辜者:)

onlcick,格打开,该启动功能被称为:

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); 
} 

这在它和自我正常工作。

如果第2点击事件打开第二窗口,它只是一个新的ID,并调用相同的功能。

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

另外,停车时,我有一个onclick =停止()调用,并从外循环,我似乎无法阻止它。

我如何重新安排这个工作?

它应该支持启动,停止和autoupdating,1级或多个同步的项目。

回答

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秒钟完成,超时将在它返回后的5秒内再次ping,而不是每5秒盲目发射一次,无论是否请求已完成。

+0

hrm ...我把它作为setTimeout,并被告知这不是要走的路,间隔是更聪明的方法。 这会支持多个呼叫吗? ID = 1和ID = 2调用相同的功能(因此,xstatus响应2个单独的时间间隔)? – briansol 2013-02-20 20:10:54

+0

为什么使用setTimeout'不是要走的路? 它应该适用于多个呼叫;该ID由超时回调关闭,并且每次迭代都向前发送,并且对每次startLoop调用都分别进行维护。我在本地测试了这个,并且有两个并排运行的循环方案似乎工作正常。 – BrMcMullin 2013-02-20 20:34:47

+0

感谢您的建议。我会努力工作并报告我的结果(有大量的事情正在进行) – briansol 2013-02-20 20:57:04