首页 > 解决方案 > 尝试使用 setTimeout() 每 5 秒间隔一次 XMLHttpRequest() API 调用时出现问题

问题描述

我正在为一个项目进行初始数据提取。它将被缓存,进一步的请求将少得多。我试图每隔 5 秒间隔一次我的 API 请求,以避免服务器超载并按照他们的规则达到速率限制。看来我的setTimeout()功能实际上并没有按预期工作。我记录了时间戳以查看所有迭代似乎都在完全相同的时间发生。我认为这在某种程度上是由于 javascript 的异步性质,但我不知道如何解决它。任何帮助将不胜感激。

代码摘录:

var leagues;
function getLeagues(){

    var reqURL = "url";
    var data = new XMLHttpRequest();
    data.open("GET", reqURL);
    data.responseType = "text";
    data.send();

    // parse data on load
    data.onload = function() {
        // League IDs
        leagues = JSON.parse(data.response)

        for (i = 0; i < 5; i++) {
            delay(i); // iterate every 5 secs
        }
    };
}

function delay(i) {
  setTimeout(() => {
    var d = new Date();
    console.log(d.getSeconds())
  }, 5000);
}

标签: javascriptsettimeout

解决方案


你打电话delay告诉 JS 在 5 秒内做某事。

然后你马上打电话delay告诉 JS 在 5 秒内再做点什么。

所以 5 秒后第一个delay超时触发,然后立即触发第二个超时。


如果你想将它们分开,那么你需要:

  • 在 setTimeout 调用的函数中第二次调用延迟,因此第二个计时器不会在第一个计时器下启动完成
  • 乘以你的时间,所以第一个是 5 秒,第二个是 10 秒,依此类推
  • 重构代码以setInterval改用

推荐阅读