0

我有以下 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 每隔 500ms 运行一次 isOnline() 以不断检查网站的状态。在我的 isOnline 代码中,如果我检查它是否处于脱机状态,然后再次运行 checkServerStatus,如果我仍然连接,请返回。

另外,我想补充两点,当 checkServerStatus 失败时,递归调用另一个函数 isOnline2 进行检查,直到它在线,然后我再次调用 checkServerStatus。

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

任何关于如何调整它的想法都将非常感激。

4

2 回答 2

1

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

var interval = setInterval();
clearInterval(interval);
于 2013-07-03T19:28:39.360 回答
1

setInterval()无休止地在一个间隔上运行一个函数,直到用 . 取消clearInterval()

在您的情况下,我实际上建议不要使用setInterval,而是使用setTimeout. 这允许更好地控制执行:setTimeout 运行一次。在每个函数完成时,您应该调用 setTimeout 来调用checkServerStatusisOnline,视情况而定。

function isOnline() {

    .....

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

它还可以防止重叠:例如,如果checkServerStatus完成时间超过 500 毫秒,setInterval您将同时运行多次。

于 2013-07-03T19:33:10.370 回答