JavaScript setTimeout setInterval в одной функции

Я думаю, что мог бы быть утомлен, но я не могу ни за что в жизни понять это, и я думаю, что это происходит из-за отсутствия знаний JavaScript

var itv=function(){
 return setInterval(function(){
  sys.puts('interval');
 }, 1000);
}
var tout=function(itv){
 return setTimeout(function(){
  sys.puts('timeout');
  clearInterval(itv);
 }, 5500);
}

С этими двумя функциями я могу звонить

a=tout(itv());

и заставьте таймер цикличного выполнения работать в течение 5,5 секунд и затем выходить по существу.



Моей логикой это должно работать, но это просто не

var dotime=function(){
 return setTimeout(function(){
  clearInterval(function(){
   return setInterval(function(){
    sys.puts("interval");
   }, 1000);
  });
 }, 5500);
}

любое понимание в этом вопросе ценилось бы.

5
задан dagoof 17 March 2010 в 17:42
поделиться

3 ответа

он не может работать, потому что ваш setInterval будет вызываться ПОСЛЕ тайм-аута! ваш исходный подход верен, и вы все еще можете обернуть его в одну функцию:

var dotime=function(){
  var iv = setInterval(function(){
    sys.puts("interval");
  }, 1000);
  return setTimeout(function(){
    clearInterval(iv);
  }, 5500);
};
7
ответ дан 13 December 2019 в 05:33
поделиться

Это еще один способ написать вашу версию, вы видите, что вы передаете функцию в clearInterval, где вы должны были передать ей идентификатор таймера.

var dotime=function(){
 var g=function(){
  var f=function(){
   return setInterval(function(){
    sys.puts("interval");
   }, 1000);
  }
  clearInterval(f);
 }
 return setTimeout(g, 5500);
}

Чтобы заставить его работать, вы должны вызвать функцию:

  clearInterval(f());

Или, используя вашу версию:

var dotime=function(){
 return setTimeout(function(){
  clearInterval(function(){
   return setInterval(function(){
    sys.puts("interval");
   }, 1000);
  }());
 }, 5500);
}

Заявление об ограничении ответственности: я не тестировал это.

1
ответ дан 13 December 2019 в 05:33
поделиться

Думаю, вы делаете ошибку, потому что функция itv не возвращает setInterval (function () {sys.puts ('interval');}, 1000) он выполняет setInterval (function () {sys.puts ('interval');}, 1000) и затем возвращает идентификатор, который генерирует setInterval. Затем этот идентификатор передается в функцию clearInterval , чтобы остановить то, что делает setInterval (function () {sys.puts ('interval');}, 1000) .

Edit : Пример одной функции, которая будет работать.

var dotime=function(){
 // Start our interval and save the id
 var intervalId = setInterval(function(){
  // This will get executed every interval
  sys.puts("interval");
 }, 1000);

 // Start our timout function
 setTimeout(function(){
  // This will get executed when the timeout happens
  clearInterval(intervalId); // Stop the interval from happening anymore
 }, 5500);
}
4
ответ дан 13 December 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: