【问题标题】:Execute AJAX every n seconds using setTimeout(fn, 0) [duplicate]使用 setTimeout(fn, 0) 每 n 秒执行一次 AJAX [重复]
【发布时间】:2018-04-14 14:53:28
【问题描述】:

我正在尝试执行 Ajax 调用以检查数据库表是否已使用某些特定的新数据进行更新。

我在这个question 中找到了部分解决方案:而不是使用while 循环(显然会淹没浏览器),应该使用两个独立的函数,其中一个使用setTimeout(fn,0)(解释为什么这样技巧成功地允许 Ajax 调用不重叠和淹没浏览器here 和这个video)。

我的问题是:如何强制每次 Ajax 调用之间有一个特定的时间间隔?我试过设置一个优于 0 的时间(例如 setTimeout(checkNewData(), 7000); ),但这似乎对每个 Ajax 调用之间的实际延迟没有影响:一旦完成,下一个就开始。

注意:在下面的示例中,我有一个开/关开关(存储在autoload_switch),可以切换以中断进程

checkNewData() //starts the looping function

function checkIfAutoLoadOn(){
    if(autoload_switch === "on")
        setTimeout(checkNewData(), 7000);
}

function checkNewData() {
  //Check if solutions
  $.ajax({
      async: true,
      type: "POST",
      url: "cgi-bin/check_NewData.py",
        contentType: "application/x-www-form-urlencoded;charset=ISO-8859-15",
      data: JSON.stringify(data_refs),
      dataType: "json"
    })
    .done(function(result) {
      if (result["new_data"]==="true") {
        // Do sth with data     

      } else if (result["new_data"]==="false") {
        //Check again in some seconds if new data arrived
        checkIfAutoLoadOn()     
      }
    })
}

【问题讨论】:

  • 我想你想要setInterval()。
  • checkNewData() 执行查询并将结果作为参数返回给setTimeout。您想通过省略括号来传递引用。 (所以setTimeout(checkNewData, 7000);)(正如AjAX所提到的,使用setInterval重复它而不是执行一次。
  • @AjAX。谢谢,但我也尝试过 setInterval(),但我相信它不会像 setTimeout(fn, 0) 那样阻止 ajax 调用重叠。
  • @Ivar 感谢您详细说明:我没有意识到使用括号会产生这种后果。但确实删除它们可以考虑毫秒数。请注意,我不必为此使用setInterval()。如果您想发表评论作为答案,我很乐意接受。
  • @sc28 如果这是唯一的问题,最好将其作为副本关闭。

标签: javascript ajax settimeout


【解决方案1】:

您现有的代码中只有 1 个错误

你写了

setTimeout(checkNewData(), 7000);,

而不是

setTimeout(checkNewData, 7000);

希望能解决你的问题

checkNewData(); //starts the looping function

function checkIfAutoLoadOn(){
    if(autoload_switch === "on")
        setTimeout(checkNewData, 7000);
}

function checkNewData() {
  //Check if solutions
  $.ajax({
      async: true,
      type: "POST",
      url: "cgi-bin/check_NewData.py",
        contentType: "application/x-www-form-urlencoded;charset=ISO-8859-15",
      data: JSON.stringify(data_refs),
      dataType: "json"
    })
    .done(function(result) {
      if (result["new_data"]==="true") {
        // Do sth with data     

      } else if (result["new_data"]==="false") {
        //Check again in some seconds if new data arrived
        checkIfAutoLoadOn()     
      }
    })
}

【讨论】:

  • 感谢您的示例,但我相信setInterval() 不会像setTimeout(fn, 0) 那样阻止ajax 调用重叠(至少当我尝试将此示例应用于我的情况时不会) .我认为我的问题是在 setTimeout() 调用的函数中使用括号(请参阅主要问题中的评论)。
  • 为什么要在0秒内执行ajax调用?
  • 好吧,我真的不想要,但这个技巧确保下一个 Ajax 调用不会被调用,直到堆栈从上一个清除(我发现我最初的问题中引用的视频非常清楚地解释了这一点)。我想结合这个技巧并选择每次通话之间的等待时间。正如 Ivar 所指出的,这很简单,只要被调用的函数不包含括号。
  • 请确定您要做什么?
  • 我想运行一系列肯定会按顺序启动的 Ajax 调用,它们之间至少有一定的时间步长(例如 30 秒)。这是必需的,因为在某些情况下 Ajax 可能需要长时间的服务器端处理(超过 30 秒),而在其他情况下,Ajax 可能相当快(2 秒)。通过上面的机制,我可以保证如果前一个调用超过 30 秒,则不会触发 Ajax 调用。当然还有其他方法可以实现这一点,但我在不使用setInterval() 的情况下获得了我需要的功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 2011-03-24
  • 2022-12-11
  • 2014-07-29
  • 1970-01-01
相关资源
最近更新 更多