今天在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
。但是,似乎fuzz
和buzz
发生在循环中的某个随机点,bar
是最后打印的内容(有时)。 myarr
是我通过连接到Redis
数据库构建的数组。
我是否必须强制Node
同步进行循环?我在代码中使用Redis
个客户端..这些会导致问题吗?有任何想法吗?非常感谢:)。
答案 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包中的同步等效项。或者,您可能希望在一次批量执行命令之前查看堆叠命令的方法