【问题标题】:Executing a timeout prior to the defined delay在定义的延迟之前执行超时
【发布时间】:2011-08-18 11:08:39
【问题描述】:

假设我有以下 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?

【问题讨论】:

    标签: javascript timeout


    【解决方案1】:

    在服务器端,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,清除超时,然后调用 _onTimeout --- 但正如我所说,可能有一天会中断。

    此外,nodeJS 超时并不总是在应该触发的时候触发,但可以与您的 CPUHZ 网格对齐....如果您运行的是 100hz 的 linux,您将获得 10ms 的分辨率。与 hrtime 提供的计时器相比,我已经看到它们或早或晚触发。

    【讨论】:

    • 感谢您的信息,但正如您所说,弄乱私有字段/方法非常危险,因为它们可能不跨浏览器兼容并且将来可能会中断。准确性问题不是一个问题,因为它在何时触发并不重要,但更重要的是它在设置超时和此后几秒钟之间触发(默认设置为 500 毫秒)
    【解决方案2】:

    我认为不存在这样的功能...但是您已经保存t,为什么不保存f

    【讨论】:

    • 这个想法其实很简单,我从来没有想过...谢谢。
    【解决方案3】:

    不,这不可能。

    但是,您可以为 setTimeoutclearTimeout 编写一个包装器来实现这种行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多