2

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

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

4

2 回答 2

2

是否“阻塞”取决于您 - 是否需要很多时间?

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

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

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

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

于 2012-06-25T07:09:23.677 回答
0

如果这是一个“便宜”的操作,那很好。任何在不执行 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 密集型功能。

于 2012-06-24T19:30:40.767 回答