2012-04-23 31 views
3

编辑关于节点的代码风格

THX到所有的答案,
最后我决定使用一些工具,如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 
}); 

希望这有助于。

编辑结束


由于都知道,
节点的内置或第三部分的模块通常提供异步API,
和使用“回调”的处理结果的功能。

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

    //some codes 
       } 
     } 
    } 
} 

这样的代码是难以阅读。

我知道“延期”库可以解决这个问题,
有什么好的“延期”模块的节点?
如果我用“deferred”编码Node,性能如何?

+0

它的默认代码风格...怎么可能是难以阅读?不明白。 – Cynede 2012-04-23 10:23:19

+0

您不需要延期,您需要正确使用控制流程。也知道学会有效地利用回调 – Raynos 2012-04-23 11:20:41

回答

4

一个大问题,基于节点的代码;你经常种植“回拨金字塔”。有几种方法来处理这个问题:

代码风格:

使用此烦恼为契机,打破你的代码成一口大小的块。这意味着你可能会有很多小命名的funcs - 尽管这可能就好了!你也可能找到更多的重用机会。

流量控制库

正好有593.72十亿流量控制库在那里。下面是一些比较流行的:

  • Step超级基本串行&平行流管理。
  • seq是一个较重但功能更全的流量控制库。
  • 还有很多。对于“流”和“流量控制”搜索the npm registry(抱歉,不会出现可链接)

语言扩展

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

这条路线是对一些交易断路器:

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

未来:

节点的核心团队是非常意识到了这个问题,并且也在努力下级组件,以帮助缓解疼痛。看起来他们将在v0.8中引入a basic version of domains,这提供了一种滚动错误处理的方法(主要避免常见的return err if err模式)。

这应该开始奠定清洁流量控制库一个很好的基础,并开始铺路处理回调金字塔的更一致的方式。现在有太多的选择了,社区还没有接近达成一些标准。

参考文献:

0

有些图书馆在某些情况下可能会有用,但作为一个整体,您在使用它们做任何事情之后都不会感到兴奋。

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

你可以看看这里的递延样库

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

而且这个问题很相似

What nodejs library is most like jQuery's deferreds?

而作为最终的奖金,我建议你看一看CoffeeScript 。它是一种语言,编译为javascript并具有更美丽的语法,因为删除了功能大括号

+2

CoffeeScript不能解决意大利面代码的问题 – pomeh 2012-04-23 10:40:42

+0

是的,但它确实使阅读更容易。当然这是一个意见问题! – drinchev 2012-04-23 10:42:07

+0

我知道CoffeeScript,我认为它比“意大利面”情况下的原始JS代码好一点。我总是担心“延迟”的性能问题,所以我决定不使用它。 – Kevin 2012-04-23 10:45:31

1

有大量“延期库”。看看http://eirikb.github.com/nipster/#promise那里有http://eirikb.github.com/nipster/#deferred。选一个,这只是风格简约& :)

+0

所以你的意思是有使用“延迟”没有性能问题? – Kevin 2012-04-23 10:46:57

+1

我从来没有这么说过:)我认为延期不会比“原生代码”表现得好*但影响有点小。但是我没有指标来说明是或否,这可能是一个问题 – pomeh 2012-04-23 10:50:59

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

同样的事情,没有嵌套。

0

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