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调用网站;我希望你知道我的意思。我想将arrayWithReachabilityResultStrings
传递给all.jade
,因此程序必须等到for循环结束。但我不知道如何让它等待。我知道“问题”是node.js的异步行为,但我不知道如何解决这个问题。
答案 0 :(得分:1)
修复你的遗失“并移动你的
res.render("all.jade,{servers: data, status: arrayWithReachabilityResultStrings});
一行。它需要由connection.query中的回调调用,因为现在它被更快地调用。 如果你阅读一些关于javascript变量范围的内容,那也会很好。 This SO question做得很好。
P.S。:很高兴看到新人学习节点。
答案 1 :(得分:1)
如果您需要运行任意数量的子命令并等待它们全部完成,您应该考虑一个辅助库,如async.js,并使用async.queue流控制功能。在没有任何流量控制设施的情况下,这种协调在节点中实际上有点棘手。但是,它当然是可能的。在这种情况下,您需要一个单独的done
计数器,您可以在每个'exit'事件上递增,当所有子进程都已启动并且所有子进程都已完成时,您就完成了。