使用 node.js 中提供的回调参数侦听事件

Listening to events with a provided callback param in node.js

提问人:aspirinemaga 提问时间:3/31/2023 更新时间:3/31/2023 访问量:26

问:

我的 node.js 服务器连接到 websocket。它不断发送:Events.emit('ws-price', data)

从 js 文件的另一部分,我们可以开始和停止侦听这些事件。为了能够 removeListener - 应对 和 使用相同的回调函数。Events.onEvents.off

如何在回调方法的“run”和“stop”函数中访问提供的“bot”参数?

const Events = require('../services/events')

module.exports = {
  run: async (bot) => {
    Events.on('ws-price', callback(event, bot)) // <--- pass "bot" variable
  },

  stop: async (bot) => {
    Events.off('ws-price', callback(event, bot)) // <--- pass "bot" variable
  }
}

const callback = (event, bot) => {
  console.log(bot?.id, event) // How to access "bot" here ?
}

我收到错误:ReferenceError: event is not defined

JavaScript 节点 .js 事件

评论


答:

2赞 T.J. Crowder 3/31/2023 #1

您必须创建一个包装函数,该函数在调用时关闭该函数,同时使用 和 接收。然后记住该函数,以便在调用时将其删除(Map 对此很有好处):botcallbackboteventstop

// A map of the current callbacks (have been `run` and not `stop`ped)
const callbacks = new Map();
module.exports = {
    run: async (bot) => {
        const cb = (event) => callback(event, bot);
        callbacks.set(bot, cb);
        Events.on("ws-price", cb);
    },

    stop: async (bot) => {
        const cb = callbacks.get(bot);
        if (cb) {
            callbacks.delete(bot);
            Events.off("ws-price", cb);
        }
    },
};

评论

0赞 T.J. Crowder 3/31/2023
(哎呀,停止呼叫时有轻微的编辑错误。如果您没有看到 Events.off(“ws-price”, cb);,请点击刷新。
0赞 aspirinemaga 3/31/2023
谢谢,它应有尽有。我必须替换 to 的 Map 键才能使其工作,就像一个对象一样,我没有提到这一点。botbot.idbot
0赞 T.J. Crowder 4/1/2023
@aspirinemaga - 在 .但是,如果它们具有唯一的 ID,并且您想改用这些 ID,那也有效。:-)Map