Node.js代码执行顺序

3
今天是我在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个回答

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
我自己也经常去那里 :) 祝你 Node 编程愉快。 - MattJ

1

使用exec会导致这些操作异步运行。您可能想要查看fs包以获取同步等效项。或者,您可能希望找到一种方法,在执行所有命令之前将它们堆叠在一起批量执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接