Как постепенно увеличивать или уменьшать интервал в setInterval () - PullRequest
0 голосов
/ 09 декабря 2018
var x = 0;

var int = 1000; //1000ms interval

function Start(){
    setInterval(function(){
        console.log(x += 1);  //increasing x value by 1 every int miliseconds

        console.log("Interval: " + int);  //outputting interval value (in my case, it is always 1000ms, i want it to be for example: 1000ms, 950ms, 900ms, 850ms, ... , 15ms, 10ms, 5ms, 0ms)

    }, int); //how to increase/decrease this 'int' value gradually - (for example: 1000ms, 950ms, 900ms, 850ms, ... , 15ms, 10ms, 5ms, 0ms)
}

Моя цель: постепенно увеличивать значение «х» на 1 (вначале «х» медленно увеличивается, и по мере увеличения начинает расти все быстрее и быстрее)

Ответы [ 5 ]

0 голосов
/ 09 декабря 2018

Насколько я понимаю, ваша идея состоит в постепенном изменении значения int.Я придумал маленький алгоритм для вас.Я изменяю значение int на step value, which is becoming roughly 2 times smaller every time we get to the middle of the previous top`.Вот код:

var x = 0,
    top = 1000,
    middle = top / 2,
    int = 1000,
    step = 50,
    minStep = 5;

function start()
{
    if (int <= middle && step > minStep) {
        top = middle;
        middle = top / 2;
        if (middle % 50) {
            middle = Math.floor(middle / 50) * 50;
        }
        step /= 2
        if (step % 5) {
            step = (Math.floor(step / 5) + 1) * 5;
        }
    }
    if (!int) return;
    setTimeout(function() {
       console.log(x++);
       // to check how int changes: console.log("int: " + int);
       int -= step;
       start();
    }, int);
}

start();

Надеюсь, это полезно.

0 голосов
/ 09 декабря 2018

Это также возможно, просто используя setInterval путем повторного запуска функции.

(function(){
  var x = 0;
  var interval = 1000; //1000ms interval
  var decreaseBy = 100;
  var scheduler;
  
  function setScheduler(){
    scheduler = null;
    scheduler = setInterval(function(){
      intervalTask();
    }, interval);
  }
  
  function intervalTask() {
    
    // function that you want to execute
    console.log(x += 1);

    console.log("current interval: " + interval);
    
    clearInterval(scheduler);
    
    if(interval <= 0) {
      return;
    }
    
    interval = interval - decreaseBy;
    
    // define it again to reinitiate the interval
    setScheduler();
  }
  
  // start it when you need it to
  setScheduler();
  
})();
0 голосов
/ 09 декабря 2018

Как только вы установите время таймера, оно не может быть изменено.Решение состоит в том, чтобы использовать setTimeout вместо setInterval, чтобы вы могли установить новый таймер с новой задержкой.Каждый последующий таймер может использовать другое время:

var x = 100;      // Display data
var int = 1000;   // Initial delay
var timer = null; // will hold reference to timer

function countDown(){
  if(x === -1){ return; } // exit function when timer reaches 0
  console.log(x);

  // recursive call to current function will establish a new timer
  // with whatever the delay variable currently is
  setTimeout(countDown, int); 

  int -= 10; // Decrease the delay for the next timer
  x--;       // Decrease the display data
}

countDown();
0 голосов
/ 09 декабря 2018

Как утверждает Темму, вы не можете.Тем не менее, было бы плохой идеей каждый раз создавать новый интервал, так как это может привести к серьезной утечке памяти.

Вместо этого используйте setTimeout:

var x = 0,
    int = 1000;

function start()
{
   setTimeout(function() {
      console.log(x++);
      int -= 50;
      start();
   }, int);
}

start();
0 голосов
/ 09 декабря 2018

Вместо этого используйте setTimeout () с рекурсивным подходом, каждый раз вызывающим себя с более низким значением delay.Проверьте следующий пример:

var x = 0;
var time = 1000;

function Start()
{
    x += 1;
    time -= 50;
    console.log("x:" + x, "time:" + time);

    if (time > 0)
        setTimeout(Start, time);
}

// Initialize the recursive calls.

Start();
...