-2

简而言之,newsCheck如果用户不在主页上,我需要清除调用函数的时间间隔。看起来很简单,我也是这么想的。这给我带来了巨大的问题。我使用历史 API,这就是为什么在页面重新加载和更改时间隔不会清除的原因。

这是我忽略了不重要的脚本的内容

//only run if on home page
if (url == 'Home' || url == ''  || url == 'home' || url == 'home.html' || url == 'Home.html'){

    //set up interval handler for cancellation when not on home 
    var handle=self.setInterval(function(){newsCheck()},1000);

    // ...

}//close if Home clause 
else
{
    handle = self.clearInterval(handle);
} 

好的,newsCheck这是一个通过 ajax 查询(轮询)从数据库中检查新信息的函数。这需要在不在家时取消,因为没有必要。

有关历史 API 的额外信息

我需要取消间隔,因为我使用历史 API 脚本加载新页面,因此即使我们不在主页上,该函数也会继续运行。

为了解决这个问题,我把它放在loadContent历史 API 的函数中。

$.ajax({
         type: "GET",
         url: "AJAX/request_feed.js",
         dataType: "script"
        });

如您所见,它运行我们所在的任何页面,以便newsCheck可以取消该功能。这就是我在上面的脚本中检查 url 的原因。

在具有newsCheck函数的脚本中,我将 url 变量放在了 url 之前,(document).ready以便在 url 更改为新 url 时检索 url,因此它不会获取上一页的 url。然后我们检查 URL 并运行脚本Home,如果没有,我们清除间隔。

4

1 回答 1

1

我认为这就是你想要的:

//only run if on home page
if (url == 'Home' || url == ''  || url == 'home' || url == 'home.html' || url == 'Home.html'){

    //set up interval handler for cancellation when not on home 
    var handle= setInterval(function(){newsCheck()},1000);

    // ...

}

编辑:鉴于您正在使用 HTML5 历史 API 更改代码,我认为您需要的是:

// Set up the handle globally, because you won't have a history event triggered right away
var handle = setInterval(function(){newsCheck()},1000);
// Cancel it right away if you're not on the home page
if (url != 'Home' && url != ''  && url != 'home' && url != 'home.html' && url != 'Home.html') {
    clearinterval(handle);
}

// Listen for history API events
window.addEventListener('popstate', function(event) {
    // Check the new url
    if (url == 'Home' || url == ''  || url == 'home' || url == 'home.html' || url == 'Home.html') {
        // On the home page now, so set up the interval
        // And we're inside an anonymous function now, so scope the handle to the window
        window.handle = setInterval(function(){newsCheck()},1000);
    } else {
        // Not on the home page now, so clear the interval
        // No guarantee that the interval exists at this point
        if(window.handle)
            clearinterval(window.handle);
    }
});

而且我认为您需要为“pushstate”事件侦听器做类似的事情,但是我对这件事有点模糊,所以您只需尝试一下即可。

原始回复

几个指针。

  1. setInterval现在是大多数浏览器的javascript实现中的本机代码。您不需要在任何地方进行范围。请参阅MDN上的文档和示例。
  2. 您不需要清除主页以外的页面上的间隔。主页以外的页面应该设置它。
  3. 每秒一次的 Ajaxing 新闻非常疯狂。一旦你解决了代码,我强烈建议移到更长的时间间隔。您的服务器和您的计算机速度慢、延迟高或互联网服务差的用户会感谢您。
  4. 根据你从哪里得到url,它可能完全是假的。您是否验证过它具有正确的价值?您确定要与之比较的所有值都是可能性吗?

此外,MDN 对从间隔调用的长时间运行的操作有这样的说法:

危险使用

如果您的逻辑执行时间可能比间隔时间长,建议您使用 window.setTimeout 递归调用命名函数。例如,如果使用 setInterval 每 5 秒轮询一次远程服务器,网络延迟、服务器无响应以及许多其他问题可能会阻止请求在分配的时间内完成。因此,您可能会发现排队的 XHR 请求不一定按顺序返回。

对于这种情况,首选递归 setTimeout 模式:

(function loop(){
    setTimeout(function(){

       // logic here

       // recurse
       loop();

    }, 1000);
})();

在上面的代码片段中,声明了一个命名函数循环并立即执行。逻辑完成执行后,在 setTimeout 内递归调用循环。虽然此模式不保证在固定间隔上执行,但它确实保证前一个间隔在递归之前已经完成。

我建议从 AJAX 完成回调中为下一个 newsCheck() 调用设置超时。这样它仍然是异步的,你不可能一次触发多个请求。

于 2012-12-12T23:44:59.073 回答