Javascript 关于节点';s代码样式

Javascript 关于节点';s代码样式,javascript,node.js,coding-style,deferred,Javascript,Node.js,Coding Style,Deferred,编辑 感谢所有答案, 最后我决定使用一些工具,比如, 我所需要的只是“流量控制”,不想要任何可能会降低性能的东西(我不知道它到底会产生多大的影响,或者这种影响可以忽略不计) 所以我只是创建了一个用于流量控制的小工具: line.js /** * Create the "next" function * * @param {Array} tasks * @param {Number} index * @param {Number} last */ var next = functi

编辑

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

我所需要的只是“流量控制”,不想要任何可能会降低性能的东西(我不知道它到底会产生多大的影响,或者这种影响可以忽略不计)

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

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
});
希望这有帮助

编辑结束


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

这很酷,但有时代码是这样的:

                   //some codes
              }
         }
    }
}
像这样的代码很难读懂

我知道“延迟”库可以解决这样的问题,
节点是否有良好的“延迟”模块?

如果我用“deferred”(延迟)编码节点,性能如何?

有些库在某些场景中可能很有用,但总的来说,在所有情况下都使用它们之后,您不会感到兴奋

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

你可以在这里找图书馆

这个问题也很相似


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

有大量的“延迟库”。到处看看。选择其中一个,只是风格和简单性的问题:)

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

而不是

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

同样,没有嵌套。

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

基于节点的代码有一个很大的问题;您经常增长“回调金字塔”。处理这个问题有几种方法:

代码样式:

利用这一烦恼将代码分解成小块。这意味着你可能会有一个微小的命名funcs扩散-这可能只是罚款,虽然!您可能还会发现更多的重用机会

流量控制库

现在有5937.2亿个流量控制库。以下是一些比较流行的:

  • 超级基本的串行和并行流管理
  • 是一个更重但功能更全的流量控制库
  • 还有很多。搜索“流量”和“流量控制”(抱歉,似乎无法链接)
语言扩展

有几次尝试在JavaScript(或CoffeeScript)之上提供更同步的感觉语法,通常基于脚本背后的概念

  • 这是OkCupid团队的答案
  • 他们还将TameJS作为叉子移植到CoffeeScript上
  • 与TameJS非常相似
  • 这是解决问题的一种较重的方法
这条路线对某些人来说是一个破坏者:

  • 它不是标准的JavaScript;如果您正在构建库/框架/等,则查找帮助将更加困难
  • 根据库的不同,变量作用域可能以意外的方式运行
  • 生成的代码可能很难调试并与原始源代码匹配
未来:

node核心团队非常清楚这个问题,并且正在开发较低级别的组件,以帮助减轻痛苦。看起来他们将在v0.8中引入,它提供了一种汇总错误处理的方法(主要是避免常见的
返回err if err
模式)

<>这应该开始为更清洁的流量控制库打下基础,并开始为更一致的回调金字塔处理铺平道路。现在有太多的选择,社区甚至还没有接近于就一些标准达成一致

参考文献:

  • 关于这个问题

这是默认的代码样式。。。那怎么会更难读呢?你不需要延迟,你需要正确地使用控制流。也被称为学习有效地利用回调是的,但它确实使阅读更容易。当然这是意见的问题!我知道CoffeeScript,我认为它比“意大利面”情况下的原始JS代码要好一点。我总是担心“延迟”的性能问题,所以我决定不使用它。嗯,我不这么认为。不管是否使用CoffeScript,您仍然有一个函数,它接收回调作为参数,它接收回调作为参数,它接收回调作为参数,它接收回调作为参数,它。。。天哪,递归!但我同意你其余的回答:)@Kelvin你担心什么问题?@pomeh这就是CS。。。这只是一个适合您眼睛的优雅解决方案;)那么你的意思是说使用“延迟”不会有性能问题吗?我从来没有这样说过:)我认为延迟的性能不如“本机代码”,但影响不大。但我没有标准来判断是或否,这可能是一个问题