Javascript Node.js代码执行顺序

Javascript Node.js代码执行顺序,javascript,node.js,redis,Javascript,Node.js,Redis,今天是Node编程的第一天。我一整天都过得很好,但有一些奇怪的事情。我可能不理解节点的异步性或其他东西 我有一个执行shell命令的函数: 函数put(error,stdout,stderr){sys.put(stdout);} 然后我执行一些命令: exec( "foo", puts ); myarr.keys( "mykey", function ( err, replies ) { replies.forEach( function ( reply, i ) { exec

今天是Node编程的第一天。我一整天都过得很好,但有一些奇怪的事情。我可能不理解节点的异步性或其他东西

我有一个执行shell命令的函数:

函数put(error,stdout,stderr){sys.put(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
数据库构建的一个数组


我是否必须强制
节点
同步执行循环或其他操作?我正在代码中使用
Redis
客户端。。这些会导致问题吗?有什么想法吗?非常感谢:)。

使用exec会导致这些操作异步运行。您可能希望查看fs包中的同步等价物。或者,在一批执行所有命令之前,您可能需要研究一种方法来堆叠命令。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的回复,这些回复可能在将来的任何时候都会出现。

在我之前已经出现过很多次:)Happy Node hacking。