【问题标题】:About Node's code style关于 Node 的代码风格
【发布时间】:2012-05-03 22:58:05
【问题描述】:

编辑

感谢所有答案,
最后我决定使用一些工具,例如Step

我所需要的只是“流量控制”,并且不想要任何可能会降低性能的东西(我不知道它会影响多少,或者效果可以忽略不计)。

所以我只是创建了一个流控制的小工具:

line.js

/**
 * Create the "next" function
 * 
 * @param {Array} tasks 
 * @param {Number} index
 * @param {Number} last
 */
var next = function(tasks, index, last) {

    if (index == last) {

        return tasks[index + 1];
    }
    else {

        return function(data) {

            var nextIndex = index + 1;
            tasks[nextIndex](next(tasks, nextIndex, last), data);
        };
    }
};

/**
 * Invoke functions in line.
 */
module.exports = function() {

    var tasks = arguments,
        last = tasks.length - 2;

    tasks[0](next(tasks, 0, last));
};

用法:

var line = require("line.js");
line(function(next) {

    someObj.find(function(err, docs) {

        // codes
        next(docs);
    });
}, function(next, docs) {

    // codes
});

希望这会有所帮助。

编辑结束


众所周知,
Node 的内置或第三方模块通常提供异步 API,
并使用“回调”函数来处理结果。

这很酷,但有时会像这样编写代码:

                   //some codes
              }
         }
    }
}

这样的代码很难阅读。

我知道“延迟”库可以解决这样的问题,
Node 有什么好的“延迟”模块吗?
如果我使用“延迟”对 Node 进行编码,性能如何?

【问题讨论】:

  • 这是默认的代码风格...怎么会更难阅读?不明白。
  • 你不需要延迟,你需要正确使用控制流。也称为学习有效地利用回调

标签: javascript node.js coding-style deferred


【解决方案1】:

有些库在某些场景下可能有用,但总体而言,在将它们用于所有事情之后你不会感到兴奋。

根据缓慢的问题。由于 node.js 是异步的,因此包装的函数并不是一个很大的性能消耗者。

你可以在这里寻找类似延迟的库

https://github.com/kriszyp/node-promise

这个问题也很相似

What nodejs library is most like jQuery's deferreds?

作为最后的奖励,我建议你看看CoffeeScript。它是一种语言,可以编译为 javascript,并且语法更优美,因为函数大括号被删除了

【讨论】:

  • 是的,但它确实使阅读更容易。当然是见仁见智了!
  • 我知道 CoffeeScript,我认为它在“意大利面条”情况下比原始 JS 代码要好一些。我一直担心“延迟”的性能问题,所以我决定不使用它。
  • 嗯,我不这么认为。无论是否使用 CoffeScript,您仍然有一个函数接收回调作为参数,接收回调作为参数,接收回调作为参数,接收回调作为参数... OMG recursion !但我同意你其余的回答:)
  • @Kelvin 您担心什么样的问题
  • @pomeh 这就是 CS ... 只是一个优雅的解决方案;)
【解决方案2】:

有大量的“延迟库”。看看http://eirikb.github.com/nipster/#promisehttp://eirikb.github.com/nipster/#deferred。选择一个,这只是风格和简单性的问题:)

【讨论】:

  • 所以你的意思是使用“延迟”没有性能问题?
  • 我从来没有这么说过 :) 我认为 deferred 的性能不如“本机代码”,但影响有点小。但我没有指标可以判断是或否这可能是个问题
【解决方案3】:

如果您真的不喜欢这样,总是可以选择使用命名函数,这样可以减少缩进。

代替

setTimeout(function() {
  fs.readFile('file', function (err, data) {
    if (err) throw err;
    console.log(data);
  })
}, 200);

你可以这样做:

function dataHandler(err, data)
{
  if (err) throw err;
  console.log(data);
}

function getFile()
{
  fs.readFile('file', dataHandler);
}

setTimeout(getFile, 200);

同样的东西,没有嵌套。

【讨论】:

    【解决方案4】:

    我通常喜欢使用 async.js 库,因为它提供了一些关于如何执行代码的不同选项

    【讨论】:

      【解决方案5】:

      基于节点的代码的一个大问题;你经常增长“回调金字塔”。有几种方法可以解决这个问题:

      代码风格:

      利用这种烦恼将您的代码分成小块。这意味着您可能会拥有大量的小型命名函数 - 不过这可能很好!您可能还会发现更多重复使用的机会。

      流控制库

      总共有 5937.2 亿个流控制库。以下是一些比较流行的:

      • Step 超级基本的串行和并行流管理。
      • seq 是一个更重但功能更全的流控制库。
      • 还有更多。在the npm registry 中搜索“流”和“流控制”(抱歉,似乎不可链接)

      语言扩展

      有多种尝试在 JavaScript(或 CoffeeScript)之上提供更同步的语法,通常基于 tame paper 背后的概念。

      这条路线对某些人来说是一个交易破坏者:

      • 它不是标准的 JavaScript;如果您正在构建库/框架/等,则寻求帮助会更加困难。
      • 变量范围可能会以意想不到的方式运行,具体取决于库。
      • 生成的代码可能难以调试和匹配原始源代码。

      未来:

      node 核心团队非常了解这个问题,并且还在研究低级别的组件以帮助缓解痛苦。看起来他们将在 v0.8 中引入 a basic version of domains,它提供了一种汇总错误处理的方法(主要避免常见的 return err if err 模式)。

      这应该开始为更简洁的流控制库奠定良好的基础,并开始为处理回调金字塔的更一致的方式铺平道路。现在有太多的选择,而且社区还没有接近就几个标准达成一致。

      参考资料:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-07
        • 1970-01-01
        • 1970-01-01
        • 2013-07-01
        相关资源
        最近更新 更多