2012-03-29 11 views
2

初日。私は一日中うまくやってきましたが、何か変わったことがあります。おそらく、ノードの非同期性などを理解していないでしょう。Node.jsのコードの実行順序ノードでのプログラミング今日で

私はシェルコマンドを実行機能があります。

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); 

ように実行されることを意図されている2つの最後のものがfuzzであり、 buzz。しかし、ループ内のある点でfuzzbuzzが発生し、最後に(時には)barが印刷されるようです。 myarrは、私がRedisデータベースに接続することによって構築配列です。

は、私は同期ループまたは何かをするNodeを強制する必要がありますか?私はコード内でRedisクライアントを使用しています。これらは問題を引き起こす可能性がありますか?何か案は?どうもありがとう :)。 EXECを使用して

答えて

3

myarr.keys()はコールバックを取ります。これは、redisクエリが完了するまで実行されません。

あなたがそうのように、コールバック関数にそれらを移動し、その後、ループの後に実行するために「ファズ」と「話題」を必要とする場合:

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からの応答を処理するためのコードを指定する方法です。これは将来の任意の時点で発生する可能性があります。

+0

ありがとう - うまくキャッチ:)。 – ale

+1

自分自身の前に何度もありました:) Happy Node hacking。 – MattJ

1

は、これらの操作は非同期で実行するようになります。同期同値のfsパッケージを調べたいと思うかもしれません。あるいは、コマンドを1つのバッチで実行する前にコマンドをスタックする方法を調べることができます。

関連する問題