【问题标题】:Writing async javascript functions编写异步 javascript 函数
【发布时间】:2013-09-11 14:48:53
【问题描述】:

我现在对 nodejs 相当熟悉,但我之前从未尝试过构建模块。我对异步函数有点好奇。

  1. 如果你正在编写一个只返回一个值的函数,如果值得让它异步,例如,这应该写成异步吗?:

    exports.getFilename = function () { 返回文件名; }

  2. 接下来,在编写异步函数时,是否编写一个带有回调的函数足以提高性能,还是建议同时使用线程库对其进行线程处理?

抱歉这个有点明显的问题,我通常是调用这些函数的人

【问题讨论】:

  • 1.否 2. JavaScript/Node 中没有线程。
  • 好的,我知道可以使用外部库来线程化并且有集群,但我不知道不支持实际线程。谢谢!
  • @RandomUser 节点确实使用多线程(以及集群的多进程)。它只是不会让其他任何东西都可用于 JavaScript 代码。它们只是为了 native addons 支持开发异步 API。
  • Node.js 确实允许 javascript 代码通过 NPM 上的线程库使用线程。请注意,那里有很多线程库。我认为 OP 很清楚这一点,但显然评论者没有。

标签: node.js asynchronous npm


【解决方案1】:

回调和异步是两个独立的东西,尽管它们是相关的,因为在 javascript 中回调是允许您在异步代码中管理控制流的唯一机制。

非异步函数是否接受回调取决于函数的作用。一种非异步但可用于提供回调的函数类型的一个示例是迭代函数。 Array.each() 就是一个很好的例子。 Javascript 不允许您传递代码块,因此您将函数传递给迭代函数。

另一个例子是过滤函数,它修改传入的数据并返回修改后的版本。 Array.sort() 就是一个很好的例子。将函数传递给它可以让您应用自己的条件来确定数组的排序方式。

实际上,过滤函数更有理由接受函数/回调,因为它会改变算法的行为。迭代函数只是 for 循环周围很好的语法糖,因此有点多余。不过,它们确实使代码更易于阅读。

一个函数是否应该异步是另一回事。如果它做了一些需要很长时间来计算的事情(比如 I/O 操作或大型矩阵计算),那么它应该是异步的。 “长”有多长,取决于你自己的承受能力。一般来说,对于一个中等繁忙的网站,一个请求的完成时间不应超过 100 毫秒(换句话说,您应该能够至少每秒处理 10 次点击)。如果操作花费的时间比这更长,那么您应该将其拆分并使其异步,否则您将面临使站点对其他用户无响应的风险。对于非常繁忙的网站,您不应容忍超过 10 毫秒的操作。

从上面的解释可以明显看出,仅仅接受一个函数或回调作为参数并不会使函数异步。实现异步的最简单的纯 js 方法是使用 setTimeout 来中断长计算。当然,该操作仍然发生在与主 Node 进程相同的线程中,但至少它不会阻塞其他请求。要在您的服务器上使用多核 CPU,您可以使用 NPM 或集群上的线程库之一来使您的函数异步。

【讨论】:

  • 我认为接受函数的参数和“回调”之间存在差异,这将是接受函数的特定用例。 “回调”是您稍后将调用的函数,因为您的异步代码完成或触发事件等,但这与提供用于对数组元素进行排序的函数并不完全相同.我认为明确我们所说的“回调”的真正含义很重要。
  • @JonSurrell:在 javascript 编程中并非如此。将由另一个函数调用的函数通常称为callback,无论天气如何,它是同步的还是异步的。我意识到其他编程语言和计算机科学对该术语有其他定义。但是 javascript 程序员用它来简单地表示一个作为参数传递的函数。这种用法在讨论区、维基文章、博客和书籍中很常见。
  • @JonSurrell:这不是 javascript 中的特定定义与一般定义不同的唯一词。例如,Javascript 使用“上下文”一词来指代对象绑定和继承链。通常,“上下文”是指如何评估代码 - 例如在定义上下文或表达式上下文中。例如,Perl 可以在列表上下文(在列表构造中调用函数/表达式时)、标量上下文和 undef 上下文中执行代码。
  • 有趣的点。 MDN 将callback 称为forEach 的参数,但将compareFunction 称为sort 的参数。我确实认为这些功能的目的本质上(并且微妙地)不同。 MDN 术语似乎反映了ECMAScript spec。
猜你喜欢
  • 2021-12-31
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
相关资源
最近更新 更多