我现在对 nodejs 相当熟悉,但我以前从未尝试过构建模块。我对异步函数有点好奇。
如果你正在编写一个只返回一个值的函数,如果值得让它异步,例如,这应该写成异步吗?:
export.getFilename = function () { 返回文件名;}
接下来,在编写异步函数时,编写带有回调的函数是否足以提高性能,还是建议也使用线程库对其进行线程化?
抱歉这个有点明显的问题,我通常是调用这些函数的人
我现在对 nodejs 相当熟悉,但我以前从未尝试过构建模块。我对异步函数有点好奇。
如果你正在编写一个只返回一个值的函数,如果值得让它异步,例如,这应该写成异步吗?:
export.getFilename = function () { 返回文件名;}
接下来,在编写异步函数时,编写带有回调的函数是否足以提高性能,还是建议也使用线程库对其进行线程化?
抱歉这个有点明显的问题,我通常是调用这些函数的人
回调和异步是两个独立的东西,尽管它们是相关的,因为在 javascript 中回调是唯一允许您在异步代码中管理控制流的机制。
天气与否非异步函数应该接受回调取决于函数的作用。一种非异步但可用于提供回调的函数类型的一个示例是迭代函数。Array.each()
是一个很好的例子。Javascript 不允许您传递代码块,因此您将函数传递给迭代函数。
另一个例子是修改传入数据并返回修改后版本的过滤函数。Array.sort()
是一个很好的例子。将函数传递给它允许您应用自己的条件来对数组进行排序。
实际上,过滤函数有更强的理由接受函数/回调,因为它会改变算法的行为。迭代函数只是 for 循环周围很好的语法糖,因此有点多余。不过,它们确实使代码更易于阅读。
天气与否,一个函数是否应该是异步的则是另一回事。如果它做了一些需要很长时间来计算的事情(比如 I/O 操作或大型矩阵计算),那么它应该是异步的。“长”有多长,取决于你自己的承受能力。一般来说,对于一个中等繁忙的网站,一个请求的完成时间不应超过 100 毫秒(换句话说,您应该能够至少每秒处理 10 次点击)。如果操作花费的时间比这更长,那么您应该将其拆分并使其异步,否则您将面临使站点对其他用户无响应的风险。对于非常繁忙的网站,您不应该容忍超过 10 毫秒的操作。
从上面的解释很明显,仅仅接受一个函数或回调作为参数并不会使函数异步。实现异步的最简单的纯 js 方法是使用 setTimeout 来中断长计算。当然,该操作仍然发生在与主 Node 进程相同的线程中,但至少它不会阻塞其他请求。要在您的服务器上使用多核 CPU,您可以使用 NPM 或集群上的线程库之一来使您的函数异步。