SetInterval вложен в другой setInterval - PullRequest
0 голосов
/ 30 апреля 2019

Итак, я пытаюсь запрограммировать таймер, который будет выполняться каждые 1 час.Первый setInterval должен получить список элементов из веб-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);

Я знаю, что это не совсем так, потому что счетчик является локальной переменной, как и список, но у меня естьпонятия не имею, как заставить это работать иначе.Есть идеи?

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Вы можете использовать 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);
1 голос
/ 30 апреля 2019
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);
...