首页 > 解决方案 > SetInterval 嵌套在另一个 setInterval

问题描述

所以我正在尝试编写一个每 1 小时执行一次的计时器。第一个setInterval应该从 Web API 中获取项目列表,然后下一个计时器将每秒执行一次,在该计时器中,您单独检查每个项目并在需要时进行另一个查询。第二个计时器将在到达列表末尾时结束,并在下一个小时执行第一个时再次开始setInterval。为什么我首先需要 2 个计时器?简单地说,我需要第二个不打破 API 查询限制。

我对此的看法是这样的:

setInterval(function ()
{
    var counter = 0;
    var returnCode;
    var getUrl = "url";
    returnCode = httpGet(getUrl);
    var object = JSON.parse(returnCode);

    function httpGet(url){
      var response = requestSync(
        'GET',
        url, (err, res, body) => {
            if(err)
            {
                return;
            }
        });
        return response.body;
    }
    setInterval(function () 
    {
        //Do some more stuff with data here

        if(!object || typeof object.data[counter] === 'undefined')
        {
            return; //this should end the second setInterval until the first one is activated again
        }
        counter++;
    }, 1000);
}, 3600000);

我知道它不像那样工作,因为计数器是一个局部变量,列表也是如此,但我不知道如何让它工作。有任何想法吗?

标签: node.jstimersettimeout

解决方案


您可以使用 aclearInterval停止第二个循环。

/**
 * Perform a GET request and returns JSON body
 */
function httpGet(url) {
  const response = requestSync(
    'GET',
    url,
    (err, res, body) => {
      if (err) {
        return;
      }
    });

  return JSON.parse(response.body);
}

setInterval(function() {
  let counter = 0;

  // Execute one request
  const returnCode = httpGet('url');

  const descriptor = setInterval(function() {
    //Do some more stuff with data here

    if (!object || typeof object.data[counter] === 'undefined') {
      // Stop the second setInterval
      clearInterval(descriptor);

      return;
    }

    counter += 1;
  }, 1000);
}, 3600000);


推荐阅读