【问题标题】:How setInterval runs asynchronouslysetInterval 如何异步运行
【发布时间】:2018-08-31 14:15:18
【问题描述】:

我有一个 setInterval 函数,它运行调用服务器的异步代码:

setInterval(()=> {
    //run AJAX function here
}, 5000);

如果服务器在 5 秒内没有得到响应,很可能它会再次运行 set Interval,然后在同一个端点上发出多个请求,有没有办法让 setInterval 只在下一个 5 秒后开始执行AJAX 函数返回响应?

【问题讨论】:

  • 否,setInterval 设置间隔以给定的时间间隔运行
  • 那么有没有其他方法可以在不使用 setInterval 的情况下做同样的事情?
  • 是的,精心设计的setTimeout - 但这真的取决于你的实际代码
  • 同上;你需要做一个 setInterval 然后当你做异步调用时,设置一个标志来表明你已经完成了。在随后的 setInterval 调用中,您将检查该标志。
  • 你不能只将 Ajax 调用包装在一个命名函数中,然后使用 setTimeout 在 Ajax 响应回调中再次调用该函数以延迟执行吗?

标签: javascript ajax ecmascript-6 setinterval


【解决方案1】:

您想要做的是在收到响应时使用 setTimeout

这是一些伪代码

const doAjaxWithDelay = (delay)=>{
  setTimeout(()=>{
    $.ajax({
    ...
    }).done(()=>{
    // do your staff 
      doAjaxWithDelay(5000)
    })
  },delay)
}
doAjaxWithDelay(0);

【讨论】:

  • 我实际上使用了你的伪代码,它非常适合我的情况,虽然我没有发布完整的代码来说明这完全是为了什么,这个答案完全符合要求!谢谢
【解决方案2】:

改用setTimeout

function myTimer = () => {
  setTimeout(()=> {
    //run AJAX function here
    ajaxFunc();
  }, 5000);

function ajaxFunc() {
  //case success
    //do something
  // case failure
    // do something
  // finally
    myTimer();
}

myTimer()

【讨论】:

    猜你喜欢
    • 2020-11-15
    • 1970-01-01
    • 2019-02-10
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 2023-03-04
    相关资源
    最近更新 更多