javascript:setTimeout和clearTimeout问题

javascript:setTimeout和clearTimeout问题,javascript,jquery,ajax,Javascript,Jquery,Ajax,我正在尝试通过AJAX进行轮询,希望在AJAX调用成功后清除超时。问题是超时永远不会清除,新的AJAX请求不断被触发 我在SO上查找了类似的问题,但它们都表明问题是一个局部范围的变量。但是,我在函数之外声明了poll\uxhr变量 var poll_xhr=null; (函数poll(){ poll_xhr=setTimeout(函数(){ $.ajax({ 键入:“POST”, 数据类型:“json”, url:“检查状态/”, 成功:功能(数据){ 控制台日志(数据); 如果(数据=='

我正在尝试通过AJAX进行轮询,希望在AJAX调用成功后清除超时。问题是超时永远不会清除,新的AJAX请求不断被触发

我在SO上查找了类似的问题,但它们都表明问题是一个局部范围的变量。但是,我在函数之外声明了
poll\uxhr
变量


var poll_xhr=null;
(函数poll(){
poll_xhr=setTimeout(函数(){
$.ajax({
键入:“POST”,
数据类型:“json”,
url:“检查状态/”,
成功:功能(数据){
控制台日志(数据);
如果(数据=='OK'){
clearTimeout(轮询\u xhr);
window.location.href='../'
}
},
完成:投票
});
}, 3000);
})();

这就是您的代码所做的:

  • 开始超时
  • 超时过期时:发送HTTP请求
  • 当HTTP响应到达时:清除超时(太晚了,它已经被触发)并调用
    poll
    ,这将启动一个新的超时

  • 删除
    complete:poll
    并将
    poll()
    放入
    if
    语句中(您当前有
    clearTimeout
    ),如果您想发出另一个请求

    为了进行检查,在数据中添加一些警报=='OK'。如果没有,意味着数据类型不匹配。要解决此问题,请使用data=='OK'。

    您的程序流程是:将poll\u xhr设置为新的超时,它会在3000毫秒后触发并启动ajax请求。成功时,清除超时(不必要,它已经触发!!),完成后,再次轮询,开始新的超时等。这是因为AJAX请求在成功回调时再次异步调用
    poll()
    。它只是再次触发setTimeout。您能在这里发布您的
    检查状态
    代码吗。我认为
    json\u encode
    不是working@Chinu检查状态正常,我仔细检查了一下。明白你的意思了@Quentin,如果出现故障/错误,我想再调用一次ajax,那么我应该将
    poll()
    放在error属性中吗?你现有的代码意味着如果数据不是字符串“OK”,你想发出另一个请求。这表明您需要一个
    else
    ,而不是一个错误处理程序。也就是说,您的服务器端代码可能会触发错误,但您没有与我们共享它。我的错,我明白这是怎么回事。如果在出现404个错误时继续触发AJAX请求,并在成功时重定向到一个新页面,并且data==“OK”,那么我想要实现的是。然后,您可能确实希望使用错误处理程序进行重复调用。