繁体   English   中英

NodeJs 中回调参数的最佳实践

[英]Best Practice for Callback Parameters in NodeJs

背景

我是 Node.js 中快速 object 遍历的低级库的维护者。 该库的重点是速度,并且经过大量优化。 但是有一个很大的放缓:回调参数

问题

回调由库使用者提供,每次扫描可以多次调用。 对于每次调用,都会计算所有参数并将其传递给回调。 在大多数情况下,回调实际上只使用了一小部分参数。

目标

目标是消除对这些参数的不必要计算。

解决方案思路

  • 理想情况下,NodeJ 会公开回调定义的回调参数。 然而,如果没有大量的黑魔法(字符串解析),似乎不可能获得它们。 它也不能解决仅有条件地需要参数的情况。
  • 我们可以要求回调公开所需的参数,而不是尝试从回调中获取参数。 这听起来很不方便且容易出错,并且也无法解决有条件的需求。
  • 我们可以为每个参数组合引入不同的回调。 这听起来是个坏主意。
  • 我们可以为每个计算并返回参数值的参数传入 function,而不是直接传入参数。 在回调内部,参数将根据需要被调用。 这很丑陋,但可能是最好的方法?

问题

  • 其他库如何解决这个问题?
  • 还有什么其他方法可以解决这个问题?

这是一个非常基本的设计决策,我正在努力做到这一点。

非常感谢您的宝贵时间! 一如既往的赞赏!

您可以将 object 传递给回调,其中包含各种方法,使用回调的客户端可以调用以获取他们实际需要的任何参数。 这样,您将拥有一个干净的 object 接口,并且您只需计算实际请求的必要信息。

这种通用设计模式有时被称为“惰性计算”,您只需根据需要进行计算。 您可以使用访问器函数或 getter,具体取决于您要公开的接口类型。

出于性能原因,您也许可以在每次调用回调时重用相同的 object 而不是构建新的回调(取决于您的实现细节)。

请注意,您甚至不必将计算所需的所有信息都放入 object 本身,因为 object 上的方法在某些情况下可以在进行计算时引用您自己的本地上下文和本地范围的变量。

但是有一个很大的放缓:回调参数

您真的对此进行了基准测试吗? 我怀疑构建参数值是否昂贵。 请注意,如果这是一个非常频繁使用的调用,V8 可能能够内联它,然后优化掉未使用的参数值。

理想情况下,NodeJ 会公开回调定义的回调参数。

实际上, 确实如此 如果你确实想依赖这个属性,你应该正确地记录你所做的,否则这个魔法可能会导致模糊的错误。

我们可以为每个参数组合引入不同的回调。 这听起来是个坏主意。

提供两个选项filter(key, value)filterDetailed(key, value, context)似乎不是什么大问题。 如果优化真的值得,并且正如您所说,这是一个低级库,只需 go 即可。

我们可以为每个计算并返回参数值的参数传入 function,而不是直接传入参数。 在回调内部,参数将根据需要被调用。 这很丑陋,但可能是最好的方法?

构造一个闭包 object 来传递而不是传递参数确实也有一些开销,因此您需要正确地进行基准测试。 这可能不值得。

但是,我看到您实际上将单个上下文 object 作为参数传递,计算值在该参数上作为属性访问。 在这种情况下,您可以简单地使这些属性获取器在访问它们时计算值,而不是在构造 object 时计算值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM