javascript - NodeJs 中回调参数的最佳实践
问题描述
背景
我是Node.js 中用于快速对象遍历的低级库的维护者。该库的重点是速度,并且经过大量优化。但是有一个很大的放缓:回调参数
问题
回调由库使用者提供,每次扫描可以多次调用。对于每次调用,都会计算所有参数并将其传递给回调。在大多数情况下,回调实际上只使用了一小部分参数。
目标
目标是消除对这些参数的不必要计算。
解决方案思路
- 理想情况下,NodeJ 会公开回调定义的回调参数。然而,如果没有大量的黑魔法(字符串解析),似乎不可能获得它们。它也不能解决仅有条件地需要参数的情况。
- 我们可以要求回调公开所需的参数,而不是尝试从回调中获取参数。这听起来很不方便且容易出错,并且也无法解决有条件的需求。
- 我们可以为每个参数组合引入不同的回调。这听起来是个坏主意。
- 我们可以为每个参数传入一个计算并返回参数值的函数,而不是直接传入参数。在回调内部,参数将根据需要被调用。这很丑陋,但可能是最好的方法?
问题
- 其他库如何解决这个问题?
- 还有什么其他方法可以解决这个问题?
这是一个非常基本的设计决策,我正在努力做到这一点。
非常感谢您的宝贵时间!一如既往的赞赏!
解决方案
您可以将一个对象传递给回调,该对象具有各种方法,使用回调的客户端可以调用该对象以获取他们实际需要的任何参数。这样,您将拥有一个干净的对象接口,并且您只需计算实际请求的必要信息。
这种通用设计模式有时被称为“惰性计算”,您只需根据需要进行计算。您可以使用访问器函数或 getter,具体取决于您要公开的接口类型。
出于性能原因,您也许可以在每次调用回调时重用相同的对象,而不是构建一个新对象(取决于您的实现细节)。
请注意,您甚至不必将计算所需的所有信息都放入对象本身,因为在某些情况下,对象上的方法可以在进行计算时引用您自己的本地上下文和本地范围的变量。
推荐阅读
- php - 如何使用 .htaccess 隐藏文件夹和扩展名?
- php - 在处理它之前我需要过滤 $_FILES['file'] 吗?
- python - 如何诊断不一致的 S3 权限错误
- c++ - 编译器优化协程值
- javascript - firebase 云功能部署抛出节点错误
- powershell - MuleSoft anypoint-cli 错误:无效的属性格式,预期名称:值但为 {propertyName}
- c++ - 为什么这个 SFML 代码就像一个应用程序,但没有创建一个窗口?
- java - 如何安排通过 websocket 向不同的用户发送不同的消息
- ios - Swift - 如何从 ENUM 中获取原始值
- soapui - 从 SOAPUI Pro(ReadyAPI) 迁移到 SOAPUI 免费工具不起作用