2012-06-23 43 views
0

我一直想知道用node.js這樣的語言來做這件事的最好方法是什麼。節點是異步的,但如果在繼續使用該程序之前需要調用5次調用,該怎麼辦?我正在做一些事情來啓動我的dzen和node.js,並且必須獲得輸出大小。以下是我的目標:node.js中的許多異步調用?

var geo = require('child_process').exec("i3-msg -t get_outputs", 
    function(error, stdout, stderr) { 
    var out = JSON.parse(stdout); 
    doStuff(out[0].rect); 
}); 

function doStuff(geom) { 
// set up dzen 
} 

out [0] .rect是一個包含x,y,寬度和高度的對象。

我以後需要這些值,這是我必須做的唯一的調用,所以我不必擔心它。但是如果我不得不打更多電話呢?如果我需要進行大量的調用,並且仍然必須使用node.js,該怎麼辦?我不喜歡像

var call1 = do.stuff('thing', function(data){ 
    call2(data); 
}); 

function call2(d1){ 
    do.more.stuff('yeah', function(data){ 
    call3(d1, data); 
    }); 
} 

function call3(d1,d2){ 
... 
function finallyDone(d1,d2,d3,d4,d5,d6){ 
// actually use the data now with 6 params 

這是做正確的方式,或者是有沒有更好的辦法的想法?我想我可以做這樣的事情:

var d1, d2, d3, d4, d5; 
var call1 = do.thing(stuff, function(data){ 
    setd1(data); 
}); 
function setd1(data){ 
    d1 = data; 
    getd2(); 
} 
... 
function setd5(data){ 
    d5 = data; 
    getd6(); 
} 
function getd6(){ 
    var sh = call.thing(stuff, function(data){ 
    doProgram(data); 
    }); 
} 
function doProgram(d6){ 
    console.log(d1 + d2 + d3 + d4 + d5 + d6); 
} 

會這樣嗎?全局變量通常是不好的?

+0

tehlulz的建議異步(或類似的東西;在「流程控制庫」下搜索)是一個不錯的選擇。但請注意,在node.js中,聲明爲外部函數的變量實際上是模塊範圍的,而不是全局的;如果你把所有東西寫在一個大模塊中,顯然你會失去這種優勢,但是如果你正確地模塊化,你不應該遇到麻煩(你需要的每個模塊在概念上被包裝在一個立即函數調用中,給它一個私有名稱空間)。 – ebohlman

+0

這很漂亮。我可以處理的模塊範圍。謝謝! – Rob

回答