0
app.get("/server", function (req, res){
    connection.query("SELECT * from serverdb", function(err, rows)
    {
    var data = rows;
    var reachabilityResultString="";
    var serverCount = rows.length;
    var arrayWithReachabilityResultStrings = new Array();
    var insertReachabilityResultStringIntoArray;
        for (var counterForServername = 0 ; counterForServername < serverCount; counterForServername++)
        {

            ls = childProcess.exec('ping ' + rows[counterForServername].ipadresse,function (error, stdout, stderr) 
            {
                if (error) 
                {
                     console.log(error.stack);
                     console.log('Error code: '+error.code);
                     console.log('Signal received: '+error.signal);
                     var errorSignal = ("Signal received: " + error.signal);
                     var errorReachability = "Error";

                }
                else
                {
                    console.log('Child Process STDOUT: '+stdout);
                    console.log('Child Process STDERR: '+stderr);
                    pingOutput = String(stdout);

                    console.log(reachabilityResult(pingOutput));

                    insertReachabilityResultStringIntoArray = arrayWithReachabilityResultStrings.push(reachabilityResult(pingOutput));
                    console.log(arrayWithReachabilityResultStrings);
                };

            ls.on('exit', function (code) {
            console.log('Child process exited with exit code '+code);

            });

            });
        };
    });
res.render("all.jade,{servers: data, status: arrayWithReachabilityResultStrings});
});

..これは私のコードです。私の問題は、プログラムが最初に jadecode を使用して Web サイトを呼び出すことです。私が何を意味するか知っていることを願っています。arrayWithReachabilityResultStringsto を配信したいall.jadeので、プログラムは for ループが終了するまで待たなければなりません。しかし、私はそれを待つ方法がわかりません。「問題」がnode.jsの非同期動作であることは知っていますが、これを解決する方法がわかりません..

4

2 に答える 2

1

任意の数のサブコマンドを実行し、それらがすべて完了するまで待機する必要がある場合は、async.js などのヘルパー ライブラリを検討し、async.queue フロー制御関数を使用する必要があります。この種の調整は、フロー制御機能を使用せずに手作業でコードを作成するノードでは、実際にはやや注意が必要です。しかし、それは確かに可能です。この場合、done「終了」イベントごとにインクリメントする個別のカウンターが必要になり、すべての子プロセスが開始され、すべてが終了したら完了です。

于 2013-10-28T14:22:19.317 に答える
1

不足している " を修正して移動するだけです

res.render("all.jade,{servers: data, status: arrayWithReachabilityResultStrings});

一列に並びます。これは、connection.query のコールバックによって呼び出す必要があります。これは、今でははるかに早く呼び出されるためです。また、javascript 変数のスコープについて少しお読みいただければ幸いです。このSOの質問は、その点でうまく機能します。

PS: ノードを学習している新しい人々を見てうれしいです。

于 2013-10-28T13:35:37.493 に答える