Node.js的我该怎么用?下一个()?

时间:2013-10-28 13:21:42

标签: node.js

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的异步行为,但我不知道如何解决这个问题。

2 个答案:

答案 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'事件上递增,当所有子进程都已启动并且所有子进程都已完成时,您就完成了。