Выполнение тайм-аута до определенной задержки

Скажем, у меня есть следующий код JavaScript (в глобальном контексте):

var t = setTimeout(f, a); // f is an arbitrary function, a an arbitrary timeout

Теперь можно отменить установленное время ожидания:

clearTimeout(t);

Но возможно ли также выполнить тайм-аут до его срабатывания?

Например:

var func = getFunctionFromTimeout(t); // Does a function like this exists?
clearTimeout(t);
func();

или же

executeAndClearTimeout(t); // Does this one?

3 ответа

Решение

Я не думаю, что такая функция существует... но вы уже экономите tпочему бы не сохранить f также?

На стороне сервера, node.js setTimeout предоставляет больше объекта, чем id. Это недокументированная территория, я думаю.

Конечно, использование этих внутренних компонентов может быть опасным в том смысле, что они могут меняться по мере развития узла.

node
> function x(){ console.log("hello"); }
> z = setTimeout(x,100000)
{ _idleTimeout: 100000,
  _onTimeout: [Function: x],
  _idlePrev: 
   { repeat: 100,
     _idleNext: [Circular],
     _idlePrev: [Circular],
     callback: [Function] },
  _idleNext: 
   { repeat: 100,
     _idleNext: [Circular],
     _idlePrev: [Circular],
     callback: [Function] },
  _idleStart: Thu, 18 Aug 2011 11:11:48 GMT }
> 

Похоже, вы могли бы просто сохранить z._onTimeout, очистить Timeout и вызвать _onTimeout --- но, как я уже сказал, может однажды сломаться.

Кроме того, тайм-ауты nodeJS не всегда запускаются, когда они должны, но могут быть выровнены по вашей сетке CPUHZ... если вы используете Linux с частотой 100 Гц, вы получаете разрешение 10 мс. Я видел, как они стреляли рано или поздно, по сравнению с таймерами, предоставленными hrtime.

Нет, это невозможно.

Тем не менее, вы можете написать обертку для setTimeout а также clearTimeout добиться такого поведения.

Другие вопросы по тегам