javascript - Node.js 从事件中取消 setTimeout

标签 javascript node.js

我有一些轮询服务的代码,我需要一种方法来取消该间隔 clearTimeout通过事件。超时充当间隔,在函数内再次调用 setTimeout。

因此,例如,我有另一个对象,它作为事件发射器公开,这个过程会轮询并在此过程中发出一些数据。这是一个简化的示例:

function events() {

  var timer = true;
  events.on('cancel', function() {
    timer = false;
  });

  function polling() {
    //Get some data
    events.emit('data', data);

    if (timer || typeof timer == 'number') {
      timer = setTimeout(polling, 1000);
    }
  }

  polling();

}

这可以工作,基本上当这个服务收到 cancel事件,它将计时器设置为假,由于检查,它不会继续。但是,它可能有机会通过条件,触发事件,重置计时器,然后继续。

知道是否有更防弹的方法来处理这种事情吗?基本上取消基于事件的轮询。

最佳答案

However, there could be a chance where it passed the condition, event fired, timer reset and now it continues on.



没有。 Node.js 是单线程的,并且通过事件循环工作,因此除非您允许(通过排队并在另一个事件中继续执行,例如 setTimeoutprocess.nextTick ),否则没有任何东西可以中断您正在运行的代码。

如果您想避免再次调用 polling,您应该怎么做? ,但是,使用 clearTimeout .
function events() {
  var timer = null;

  events.on('cancel', function() {
    clearTimeout(timer);
  });

  function polling() {
    //Get some data
    events.emit('data', data);

    timer = setTimeout(polling, 1000);
  }

  polling();
}

关于javascript - Node.js 从事件中取消 setTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32596102/

相关文章:

node.js - 在 OpenShift node.js 服务器上部署存储库

javascript - 如何使用 node.js 中的 C++ 库?

javascript - Node.js 在脚本之间传输数据

node.js - 使用快速代理路由没有响应

javascript - Angular 1.3.15 html5mode 深度链接、路由、哈希

javascript - 使用 html 和 css 进行分页

javascript - 文件上传 document.ready .on ('submit' ) 提交两次

mysql - Node.js mysql 模块变量

javascript - 如何关闭父窗口?

javascript - 实现客户端ajax登录,使用ajax注销安全还是需要刷新?