Есть ли способ запустить setTimeout
немедленно, а затем снова запустить в указанное время. например, я хочу, чтобы эта функция updateItemsCache запускалась при загрузке, а затем снова запускалась каждые 3 секунды.
сейчас он исполняется только каждые 3 секунды.
function updateItemsCache(){
setTimeout(() => {
//do stuff
}, 30000);
}
https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout
Нет, просто создайте функцию и вызывайте ее один раз до истечения времени ожидания и один раз за время ожидания
function updateItemsCache(){
innerLogic()
setTimeout(innerLogic, 30000);
}
function innerLogic(){
}
Следующий код объявит функцию, которая содержит setTimeout, который выполняет саму функцию. Не забудьте поставить вызов функции как последнюю вещь в вашем setTimeout.
Тогда все, что вам нужно сделать, это вызвать yout timeoutFunction().
Это гарантирует, что ваш код (который вы помещаете с помощью "//do stuff") выполняется при вызове функции. И, вызывая функцию timeout, снова запускается после желаемой задержки (мс).
const timeoutFunction = () => {
setTimeout(() => {
//do stuff
timeoutFunction();
}, ms);
}
timeoutFunction();
Если я правильно понимаю ваш вопрос, вы можете структурировать свой код, как показано ниже.
Таким образом, вы можете вызывать функцию (т.е. doStuff()
) с регулярными 3-секундными интервалами через setTimeout(iteration, 3000);
где iteration
- это функция, которая:
Этот шаблон также гарантирует, что логика запускается как сразу, так и с интервалом в 3 секунды после первого выполнения:
const doStuff = () => {
console.log('Do stuff at ${Date.now()}');
}
function updateItemsCache(){
/*
Define iteration function that invokes your
"stuff" logic
*/
const iteration = () => {
doStuff();
/*
Use setTimeout() to schedule the next iteration
at 3 seconds into the future (which will cause the
iteration to repeat on 3 second intervals)
*/
setTimeout(iteration, 3000);
}
/*
Start iteration which calls you "stuff" logic
immediately, and reschedules another iteration
*/
iteration();
}
updateItemsCache();