Node.js代码执行顺序

时间:2012-03-29 18:51:17

标签: javascript node.js redis

今天在Node编程的第一天。我整天都相处得很好,但有些东西很奇怪。我可能不理解Node的异步或其他什么。

我有一个执行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个客户端..这些会导致问题吗?有任何想法吗?非常感谢:)。

2 个答案:

答案 0 :(得分:3)

myarr.keys()接受回调,在redis查询完成之前不会执行回调。

如果你需要'fuzz'和'buzz'来执行,那么在循环之后,将它们移动到回调函数中,如下所示:

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的回复,这可能会在将来的任何时候出现。

答案 1 :(得分:1)

使用exec会导致这些操作异步运行。您可能希望查看fs包中的同步等效项。或者,您可能希望在一次批量执行命令之前查看堆叠命令的方法