【问题标题】:Using setTimout() correctly in Nodejs with a chat bot在带有聊天机器人的 Nodejs 中正确使用 setTimout()
【发布时间】:2015-10-31 11:26:43
【问题描述】:

我正在编写一个响应命令的 IRC 聊天机器人。我的问题是对命令有冷却时间。

我的想法是这样的:

setTimeout(function() {
  client.on('chat', function (channel,user, message, self) {
    if (message === 'command') {
      // do stuff
    }
  });
}, 5000);

每次用户输入聊天时,机器人都会做出反应。然后它会检查用户是否输入了命令,然后它显然会做一些事情。

但我的想法在这里行不通。机器人不断响应命令。我只是希望他在 5 秒前已经说话时不要回答。

我尝试使用计时器和 date.now 之类的东西,但我想如果我定义一个变量,比如

var timer = 100000000000000

该变量将始终具有该值,我无法更改一次,因为它将被重新定义。

http://www.tmijs.org/docs/ 是我用于机器人的库

编辑:

function doStuff(channel, user, message, self) {
      // do stuff
};


client.on('chat', function(channel, user, message, self) {
  if (message === 'command') {
    setTimeout( function() {
      client.on('chat', doStuff(channel, user, message,self));
    }, 5000);
    doStuff(channel, user, message, self);
  }
});

【问题讨论】:

    标签: javascript node.js timeout


    【解决方案1】:

    那是因为您的setTimeout 处理程序只是为chat 事件设置处理程序;它实际上并没有调用处理程序。何时调用处理程序?每次发送chat 消息。因此,请在收到 chat 事件时设置超时。比如:

    var handleMsg = function(channel, user, message, self) {
      if (message === 'command') {
        setTimeout( function() {
          client.once( 'chat', handleMsg );
        }, 5000);
        // do stuff
      }
    };
    
    client.once('chat', handleMsg );
    

    【讨论】:

    • 我有一个问题。你为什么使用 client.once ?我的机器人不知何故只在我的个人频道中工作,而不是在任何其他频道中。当使用 client.on 时,它以某种方式打印出太多东西并被禁止
    • client.once() 只是说“仅在下次触发时处理此事件”而不是“每次触发时处理此事件”的快捷方式。它基本上是client.on 的快捷方式,具有在第一次调用后分离事件处理程序的逻辑。请参阅:nodejs.org/api/events.html#events_emitter_once_event_listener 您可以在此处使用client.on,但如果是这样,您需要在click 处理程序中添加一些逻辑,以忽略在 5000MS 油门启动之前发生的消息,因为它现在将被重复调用。
    • 好的,但是对我来说,为什么该命令不适用于其他频道是没有意义的。我将如何使用点击处理程序来做到这一点?
    • 抱歉,应该是 chat 处理程序,而不是 click 处理程序,但我不允许编辑。澄清一下,您是说 .on 可以与其他频道一起使用,但 .once 不可以?
    • 曾经只在我的频道上工作,但它甚至与机器人的帐户不同。这就是为什么我很困惑。一次在我的频道上完美运行,超时 5 秒。即使只发送了 1 个命令,也只是奇怪的垃圾邮件,比如 1-5+ 个答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2011-01-17
    • 2020-05-16
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多