2012-03-29 95 views
2

今天在Node編程的第一天。我整天都相處得很好,但有一些奇怪的東西。我可能不理解節點的異步性或什麼。Node.js代碼執行順序

我有一個執行shell命令的功能:

function puts(error, stdout, stderr) { sys.puts(stdout); }

然後我執行某些命令:

exec("foo", puts); 
myarr.keys("mykey", function (err, replies) { 
    replies.forEach(function (reply, i) { 
     exec("bar"); 
    }); 
}); 
exec("fuzz", puts); 
exec("buzz", puts); 

,這樣是爲了執行的最後兩個東西是fuzz和然後buzz。但是,似乎fuzzbuzz發生在循環中的某個隨機點,並且bar是最後(有時)打印的東西。 myarr是我通過連接到Redis數據庫構建的數組。

我是否必須強制Node同步執行循環?我在代碼中使用Redis客戶端..可能會導致問題嗎?有任何想法嗎?非常感謝 :)。

回答

3

myarr.keys()需要回調,直到redis查詢完成後纔會執行回調。

如果你需要「模糊」和「嗡嗡」聲,然後後執行,並在循環後,它們移到回調函數,像這樣:

exec("foo", puts); 
myarr.keys("mykey", function (err, replies) { 
    replies.forEach(function (reply, i) { 
     exec("bar"); 
    }); 
    exec("fuzz", puts); 
    exec("buzz", puts); 
}); 

需要注意的是myarr.keys是很重要的()立即返回(當它將查詢發送到redis後)。這使您可以繼續使用其他內容,而不會阻止該進程。回調函數是指定代碼以處理來自redis的回覆的方式,這可能會在將來的任何時候發生。

+0

謝謝 - 很好抓到:)。 – ale 2012-03-29 19:12:00

+1

剛剛去過很多次,我自己:)快樂節點黑客入侵。 – MattJ 2012-03-29 19:53:39

1

使用exec會導致這些操作異步運行。您可能需要查看fs包以瞭解同步等值。或者,您可能想要考慮在將所有命令全部在一個批處理中執行之前堆疊命令的方法