【问题标题】:SetInterval nested in another setIntervalSetInterval 嵌套在另一个 setInterval 中
【发布时间】:2019-04-30 09:07:04
【问题描述】:

所以我正在尝试编写一个每 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.js timer settimeout


    【解决方案1】:

    您可以使用clearInterval 来停止您的第二个循环。

    /**
     * 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);

    【讨论】:

      【解决方案2】:
      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;
      }
      let isFinished = true;
      let ref = setInterval(function () 
      {
         // if the current iteration is taking longer than 1 second then just return;
      
         if(!isFinished){
           return;
          }
          isFinished = false
         //Do some more stuff with data here and once it is done make isFinished = true
            isFinished = true;
            counter++;
      
          if(!object || typeof object.data[counter] === 'undefined')
          {
              return clearTimeInterval(ref); 
          }
      
         }, 1000);
       }, 3600000);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-26
        • 2021-10-10
        相关资源
        最近更新 更多