【问题标题】:Is there a convention for when to use synchronous functions in Node.js?是否有关于何时在 Node.js 中使用同步函数的约定?
【发布时间】:2012-06-25 23:42:47
【问题描述】:

我正在 Node.js 中制作一些模块,并想知道:“是否有关于何时在 Node.js 中使用 return 语句的约定?”。

据我了解,应该避免使用 return 语句,因为它们会使进程成为阻塞操作,但是是否有关于何时应该使用它们以及何时应该坚持回调的指南?

【问题讨论】:

  • 我不明白——你不需要在需要返回值的时候使用return吗?
  • P.S.即使没有 return 语句,函数仍然返回 something,即未定义。当您没有显式返回时,函数不会自动变为异步。
  • 对不起,我应该澄清一下,我的意思是反对什么时候应该坚持回调。
  • 我编辑了问题的标题,所以在概览中可以更好地理解

标签: javascript node.js


【解决方案1】:

某事是否“阻塞”取决于您——这需要很多时间吗?

任何 IO 操作都应该被认为是阻塞的,因为它依赖于脚本之外的东西(这可能需要任何时间)。

如果您自己的脚本要说,循环某件事几百次(而且您知道这需要不到一秒钟的时间),您可能会认为它是阻塞的。

  • 如果一个方法是阻塞的,它应该接受一个“回调”参数,并且 异步调用。
  • 如果一个方法是非阻塞的,它不应该 接受一个“回调”参数,并且应该至少有一个“返回” 声明。

您的约定应该只是您知道函数是异步的,因为它接受回调。

【讨论】:

  • 请注意,异步函数(接受回调参数)也可能有返回,它会返回自己;适合“链接”
  • 我实际上是在过去 2 个月里自己学习 Node.js 时才意识到关于约定等的 :)
  • 为什么阻塞代码应该和非阻塞不应该接受回调?不是反过来吗?这是项目符号中的错字吗
  • 不,它应该是这样工作的。如果一个函数是非阻塞的,你可以像使用任何常规函数一样使用它——也就是说,等待它从它的处理中“返回”。如果一个函数被阻塞,你想继续为其他事情提供服务,并让它在完成后执行回调。
【解决方案2】:

如果这是一个“便宜”的操作,那很好。在您不执行 CPU 密集型操作的情况下多次执行的任何操作都可以(并且通常应该)重构为“正常”功能。这很好:

function add(x, y) { return x + y; }

这不是:

function fib(n) {
    if (n <= 1) return 1;
    // this may take a long time if n is large
    return fib(n - 1) + fib (n - 2);
}

fib 的一种可能实现将采用一个函数将结果作为参数返回,并将计算分散到多个调用中。类似于下面的代码,来自“Node Web Development”一书:

function fib(n, done) {
    if (n <= 1) {
        done(1);
    } else {
        process.nextTick(function() {
            fib(n - 1, function(val1) {
                process.nextTick(function() {
                    fib(n - 2, function(val2) {
                        done(val1 + val2);
                    });
                });
            });
        });
    }
}

线程不会被长时间阻塞的地方。

是的,更好的选择是以迭代方式实现斐波那契,而不是递归方式。但这只是为了演示如何“拆分”一个 CPU 密集型功能。

【讨论】:

  • 谢谢! (虽然我可能会说 O(2^n) 的例子有点明显)
  • @Esailija,您可以将递归更改为任何 CPU 密集型函数。递归很容易实现。如果你知道递归很快,它甚至可能也可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 2016-11-21
  • 2018-08-16
  • 2010-09-07
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
相关资源
最近更新 更多