【问题标题】:How do I JSDoc custom EventEmitter on events in Visual Studio Code?如何在 Visual Studio Code 中对事件进行 JSDoc 自定义 EventEmitter?
【发布时间】:2019-11-13 19:30:33
【问题描述】:

我一直在处理一个 Node.js 项目,只是注意到 Visual Studio Code 提供了有关基本 EventEmitter 对象的信息。所以我想应该可以为自定义提供 JSDoc。

我已经尝试遵循 JSDoc http://usejsdoc.org/tags-event.html 文档,但似乎没有成功。

我不知道这是否会影响它,但我使用的是 ES6 类,其中事件在它外部的函数中处理,但它在同一个脚本内。

这是测试代码。

// voice
if (voice) {
  try {
    /**
     * Voice event.
     *
     * @event TelegramBot#voice
     * @type {object}
     * @property {object} chat - [object Chat]
     * @property {number} date - Date when content was sent.
     * @property {object} from - [object User]
     * @property {number} message_id - Message id.
     * @property {string} caption - Caption added to message. Value is undefined if none is added.
     * @property {object} voice - [object Voice]
     */
    context.emit('voice', chat, date, from, message_id, caption, voice)
  } catch (error) {
    context.emit('error', error)
  }
}

【问题讨论】:

  • 我很想知道这个。

标签: node.js visual-studio-code jsdoc eventemitter es6-class


【解决方案1】:

我在尝试做同样的事情时发现了这个问题,所以我一直在搜索并找到了一个可能的解决方案,方法是覆盖 addListener 方法并记录它们。

我成功使它适用于 NodeJS 和浏览器 JS。

VSCode 中的结果

类型定义

首先,使用您的事件名称创建 typedef:

/**
 * @typedef {["someEvent" | "someOtherEvent", ...any[]]} eventsDef
 */

我正在使用扩展语法,因为我不知道用户将传递多少个参数给方法。

实施

对于 NodeJS:

该类需要重写onaddListener 方法,记录参数,并简单地调用父级自己的方法:

class Test extends EventEmitter {

  /**
   * @param {eventsDef} args
   */
  addListener(...args) {
    super.addListener(...args);
  }

  /**
   * @param {eventsDef} args
   */
  on(...args) {
    super.on(...args);
  }

  fireEvent() {
    this.emit("someEvent", "someValue");
  }
}

那么你可以像这样使用这个类:

const t = new Test();

t.on("someEvent", (val) => console.log(val));

t.fireEvent(); // Outputs "someValue"

对于浏览器:

该类需要扩展EventTarget 并覆盖addEventListener 方法。

这里是sn-p:

class Test extends EventTarget {
  /**
   * @param {["someEvent" | "someOtherEvent", ...any[]]} args
   */
  addEventListener(...args) {
    super.addEventListener(...args);
  }
  
  fireEvent() {
    this.dispatchEvent(new CustomEvent("someEvent", {detail: "someValue"}))
  }
}

const t = new Test();

t.addEventListener("someEvent", val => console.log(val.detail));


document.querySelector("button").addEventListener("click", () => {
  t.fireEvent();
})
<button>Fire event</button>

【讨论】:

  • 我希望有对 @event@fires 的原生智能支持
  • 感谢您的回答!我很想有一个原生的@event@fires 支持,我会考虑编写一个扩展来启用它......至于你的例子,它工作正常,除了你不返回 addListenter 和on 函数,在订阅时打破了链接的可能性,比如on('event1', ()=>{}).on(...).... 等等。
猜你喜欢
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
相关资源
最近更新 更多