用于联机状态的递归Javascript函数

用于联机状态的递归Javascript函数,javascript,recursion,Javascript,Recursion,我有以下javascript function isOnline() { var status = navigator.onLine ? 'online' : 'offline', indicator = document.getElementById('indicator'), current = indicator.textContent; // only update if it has change if (current != status) { // u

我有以下javascript

function isOnline() {

var status = navigator.onLine ? 'online' : 'offline',
    indicator = document.getElementById('indicator'),
    current = indicator.textContent;

// only update if it has change
if (current != status) {

    // update DOM
    indicator.textContent = status;

    // trigger handler
    handler[status]();
};

if(current == 'offline')
{
  setInterval(checkServerStatus, 500)
  checkServerStatus();
 }
};




function checkServerStatus()
{
var img = document.createElement("img");
img.onload = function()
{
    alert('yey!');
    setInterval(isOnline, 500);
    isOnline();
};
img.onerror = function()
{
    alert('meh.')
};
img.src = "image-small.jpg";  //image on server(should be small so that intermittent checks are not bad)
}
$(checkServerStatus);
我想做的是以下几点。 首先调用checkServerStatus()-->if online每500毫秒运行一次isOnline(),以持续检查网站的状态。在我的isOnline代码中,如果我检查它是否脱机,然后再次运行checkServerStatus,如果我仍然连接,则返回

此外,我想在此添加两件事,当checkServerStatus失败时,递归调用另一个函数isOnline2进行检查,直到它联机,然后再次调用checkServerStatus

我目前遇到的问题是checkServerStatus一直显示“yey”警报。我认为,函数只启动一次,然后使用setInterval(isOnline,500)将继续运行。在isOnline更改为offline后,我将再次运行checkServerStatus函数


任何关于如何调整间隔的想法都将不胜感激。

将间隔设置为一个变量,然后在需要停止间隔时使用clearInterval()

var interval = setInterval();
clearInterval(interval);
setInterval()
在一个区间上无限地运行函数,直到用
clearInterval()
取消为止

在您的情况下,我建议不要使用
setInterval
,而是使用
setTimeout
。这样可以更好地控制执行:setTimeout运行一次。在每个函数完成时,您应该调用setTimeout来调用
checkServerStatus
isOnline
,视情况而定

function isOnline() {

    .....

    if(current == 'offline') {
        setTimeout(checkServerStatus, 500);
    } else {
        setTimeout(isOnline, 500);
    }
};

它还可以防止重叠:例如,如果
checkServerStatus
的完成时间超过500 ms,则使用
setInterval
可以同时运行多次

无需继续检查,请改用事件:\n我怀疑问题在于缓存图像。尝试在URL中添加缓存破坏器。另一个重要的事情是使用缓存破坏和ping映像。否则,缓存图像后将触发load事件。如下所示
'image-small.jpg?+~~(Math.random()*10000000)谢谢!我会把它放进去。我不明白你的意思,因为实际上我从来都不想停止函数isOnline,但是我希望在开始时检查服务器状态一次,当isOnline离线时,我想再次调用它,直到它变回Online,从这个角度看……你有一个区间被设置为无限次运行,这就产生了无限次的其他区间,这些区间被设置为无限次运行。你真的需要能够阻止它们中的一个或两个,并对它们进行更多的控制,这样它们就不会失控(比如一次又一次地发出警报)。嘿,我已经尝试过了,但不幸的是,它每次都会弹出。。。还有其他想法吗?好吧,我让弹出窗口消失了,太棒了。。然而,我现在从来没有在isOnline上获得更新的状态