javascript - 在 node.js 中,什么时候使用事件,什么时候使用直接回调函数?

标签 javascript node.js events callback

在我看来,“核心”node.js 回调语法,即

function foo(data, callback) {
  callback(false, data2);
}

在语义上被事件取代,除了

  • 有了事件,你就失去了最后一点静态检查
  • 事件更灵活
  • 一旦你有超过 2 或 3 个回调函数,回调就会变得相当笨拙
  • 事件可能是非常轻微的性能开销(但在几乎所有情况下过早优化都是轻描淡写)
  • (不过话又说回来,你也必须记住这些事件......)

那么什么时候使用什么才是好的策略呢?

最佳答案

一个好的策略是使用最适合您的用例的抽象模型

我认为在这种情况下性能不是问题。

如果您向执行异步调用的客户端提供函数,将其作为单个函数公开(如您的示例)似乎是完全有效的,而且看起来非常干净。 (这似乎是大多数 node.js 数据库客户端的工作方式)。

正如您提到的,当回调超过 2-3 时,回调很快就会失控。但是将 2-3 回调函数建模为事件发射器会更好吗?也许吧,这取决于你。

IMO 2-3+ 回调肯定会使用 promises 更好地建模,因为调用结构会更扁平。

IMO 事件发射器通常用于站立时间较长的物体。存活时间“更长”的对象。您想创建一个对象并订阅一段时间内的事件,这似乎是一个与公开回调的单个异步函数完全不同的用例。

另一种选择是将您的客户端建模为流。

我认为一个好的经验法则是查看 Node 标准库(和流行的 Node 库)在何处将事件发射器应用于客户端,以及在何处为客户端提供基于回调的 API。

Node 将其 tcp 客户端/服务器建模为事件发射器

关于javascript - 在 node.js 中,什么时候使用事件,什么时候使用直接回调函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34877804/

相关文章:

Javascript:最近5分钟的回合时间

javascript - 如何在滚动时关闭 JS/CSS 背景效果?

javascript - MongoDB 获取最后一个元素不能与 node.js 一起正常工作

javascript - 通过 JQUERY 隐藏在 HTML 中具有数值的 SELECT 选项

javascript - 有什么方法可以知道这段 Javascript 代码的作用?

node.js - Gulp - 如何发现相对路径深度?

javascript - 避免使用 eval() 仅使用动态字符串按名称调用函数

vue.js - 重新发出具有多个参数的事件

c# - 在 (!IsPostBack) 中建立 EventHandler 委托(delegate)关联即使在第一页加载时也不起作用——为什么?

Javascript hasOwnProperty 在 Event 对象上总是 false?