@getaxe
JS developer

Как перезапустить таймер с теми же функцией и параметрами, но новым временем?

Есть функция и параметры переданные в setTimeout

function testFunc(param1:string, param2:string) {
    console.log(param1)
    console.log(param2)
}


Как мне вытащить из него правильно функцию и параметры, и передать далее?
В js это реализуемо так:

const timer1 = setTimeout(testFunc, 5000, 'asd', 'qwe')
const timer2 = setTimeout(timer1._onTimeout, 10000, timer1._timerArgs[0], timer1._timerArgs[1])
clearTimeout(timer1)


Но ts не позволяет подобного
Вопрос - как сделать нечто подобное, учитывая что 2 таймер не видит ни функцию testFunc, ни параметры переданные в нее, ибо находится в другом ивенте
  • Вопрос задан
  • 112 просмотров
Решения вопроса 1
rqdkmndh
@rqdkmndh
Web-разработчик
Чтобы выполнить перезапуск таймера в TypeScript, вы не сможете использовать свойства, такие как _onTimeout и _timerArgs, поскольку они не являются частью стандартного API и обычно не доступны для типобезопасного кода. В TypeScript (и в JavaScript в целом) для более чистого подхода рекомендуется создать обёртку для таймера, которая будет управлять поведением и позволит перезапустить таймер с новым временем.
Попробуйте так:
function restartTimer(
  originalFunc: (...args: any[]) => void,
  newDelay: number,
  ...args: any[]
): number {
  clearTimeout(timerId); // timerId должен быть доступен в области видимости
  return setTimeout(originalFunc, newDelay, ...args);
}

// Используйте так:
let timerId: number; // Храните timerId в доступном месте

function testFunc(param1: string, param2: string) {
  console.log(param1);
  console.log(param2);
}

// Запуск таймера
timerId = setTimeout(testFunc, 5000, 'asd', 'qwe');

// В нужный момент перезапустить таймер с новым временем. Например, с 10000 мс.
timerId = restartTimer(testFunc, 10000, 'asd', 'qwe');

Важно отметить, что переменная timerId должна быть доступна для функции restartTimer, чтобы она могла очистить предыдущий таймер перед запуском нового.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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