关于Node的代码风格

时间:2012-04-23 10:21:09

标签: javascript node.js coding-style deferred

修改

回答所有答案,
最后我决定使用像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,性能如何?

5 个答案:

答案 0 :(得分:4)

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

代码风格:

将此烦恼作为一个机会,将您的代码分解为一口大小的块。这意味着你可能会有一个很小的命名函数 - 但这可能就好了!您可能还会发现更多重用机会。

流量控制库

那里有5937.2亿个流量控制库。这是一些比较流行的:

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

语言扩展程序

有几种尝试在JavaScript(或Cof​​feeScript)之上提供更具同步感的语法,通常基于tame paper背后的概念。

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

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

未来:

节点核心团队非常了解这个问题,并且还在开发更低级别的组件以帮助减轻痛苦。看起来他们将在v0.8中引入a basic version of domains,这提供了一种卷积错误处理的方法(主要避免使用常见的return err if err模式)。

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

<强>参考文献:

答案 1 :(得分:1)

有大量的“延期图书馆”。看看那里http://eirikb.github.com/nipster/#promise和那里http://eirikb.github.com/nipster/#deferred。选择一个,这只是风格和问题的问题。简单:)

答案 2 :(得分:1)

如果你真的不喜欢这样,总会有使用命名函数的替代方法,这将减少缩进。

而不是

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);

同样的事情,没有嵌套。

答案 3 :(得分:0)

在某些情况下,有些库可能会有用,但总的来说,在将它们用于所有内容之后,您将不会感到兴奋。

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

你可以在这里查看类似延迟的库

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

此问题也非常相似

What nodejs library is most like jQuery's deferreds?

作为最后的奖励,我建议你看看CoffeeScript。它是一种语言,编译为javascript并具有更漂亮的语法,因为删除了函数括号

答案 4 :(得分:0)

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