【问题标题】:Node.js code execution orderNode.js 代码执行顺序
【发布时间】:2012-03-30 03:52:44
【问题描述】:

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

【问题讨论】:

    标签: javascript node.js redis


    【解决方案1】:

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

    【讨论】:

    • 在我之前去过那里很多次 :) Happy Node hacking。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-03-05
      • 2018-10-02
      • 2012-04-21
      • 1970-01-01
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      相关资源
      最近更新 更多