JavaScript setTimeout setInterval внутри одной функции
-
20-09-2019 - |
Вопрос
Я думаю, что, возможно, я переутомился, но я ни за что на свете не могу разобраться в этом, и я думаю, что это из-за недостатка знаний 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);
}
мы были бы признательны за любое понимание этого вопроса.
Решение
это не может сработать, потому что, потому что ваш setInterval
будет вызван ПОСЛЕ истечения тайм-аута!ваш первоначальный подход верен, и вы все еще можете обернуть это в единую функцию:
var dotime=function(){
var iv = setInterval(function(){
sys.puts("interval");
}, 1000);
return setTimeout(function(){
clearInterval(iv);
}, 5500);
};
Другие советы
Я думаю, ошибка, которую вы совершаете, заключается в том, что функция 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); }
Это еще один способ написать свою версию, вы видите, что передаете функцию в 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);
}
Отказ от ответственности :Я не проверял это.