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调用网站;我希望你知道我的意思。我想传递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 question在这方面做得很好。

PS:很高兴看到新人学习节点。

于 2013-10-28T13:35:37.493 回答