1

这里有一些间隔问题。

基本概念是我有一个进度条功能,每行 1 个,从后端脚本提供信息。我在 ajax 调用的间隔内每 5 秒 ping 一次这个脚本。

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

一个完整的步行虽然 - 功能名称已更改以保护无辜者:)

onlcick,div 打开,调用这个 start 函数:

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 个或多个同时项目的启动、停止和自动更新。

4

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

于 2013-02-20T19:17:48.477 回答