是否有关于何时在Node.js中使用同步函数的约定?

时间:2012-06-24 19:26:34

标签: javascript node.js

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

根据我的理解,应该避免返回语句,因为它们会使进程成为阻塞操作,但是是否应该使用它们的指南,何时应该坚持回调?

2 个答案:

答案 0 :(得分:2)

是否某些内容“阻止”取决于您 - 是否需要很长时间?

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

如果您自己的脚本要说,循环几百次(而且您知道这需要花费超过一秒的时间),您可能会认为它阻塞了。

  • 如果方法阻塞,它应该接受'callback'参数,并且 称之为异步。
  • 如果方法是非阻塞的,则不应该 接受'回调'参数,并且应该至少有一个'回归' 言。

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

答案 1 :(得分: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的功能。