2012-03-29 97 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包以了解同步等值。或者,您可能想要考虑在将所有命令全部在一个批处理中执行之前堆叠命令的方法