JavaScript setTimeout setInterval внутри одной функции - PullRequest
5 голосов
/ 17 марта 2010

Я думаю, что, возможно, я переутомился, но я не могу это понять, и думаю, это из-за недостатка знаний 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);
}

Любое понимание этого вопроса будет оценено.

Ответы [ 3 ]

7 голосов
/ 17 марта 2010

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

var dotime=function(){
  var iv = setInterval(function(){
    sys.puts("interval");
  }, 1000);
  return setTimeout(function(){
    clearInterval(iv);
  }, 5500);
};
4 голосов
/ 17 марта 2010

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

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

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);
}
1 голос
/ 17 марта 2010

Это еще один способ написания вашей версии, вы видите, что передаете функцию в 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);
}

Отказ от ответственности: я не проверял это.

...