2012-04-23 84 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庫,因爲它提供了關於如何執行代碼的幾個不同的選項