我对 Node 很陌生,正在尝试创建一些可以获取一些服务器信息的东西。但这是我的问题。我设置了一个配置对象(这将及时被发生的事件动态更新),然后在一个函数中,我尝试访问这个对象中的一个值。 (见下面的代码)
首先,我设置我的变量:
var util = require('util'),
child = require('child_process'),
config = {};
这工作正常。然后我加载我的配置:
function loadConfig( )
{
// Add some code for auto-loading of args
config = {
"daemons": [
["Apache", "apache2"],
["MySQL", "mysqld"],
["SSH", "sshd"]
]
};
}
并初始化调用函数
loadConfig();
之后,我会检查守护进程。
function getDaemonStatus( )
{
for(var i=0; i<config.daemons.length; i++)
{
child.exec( 'ps ax -o \'%c %P\' | awk \'{if (($2 == 1) && ($1 == "\'' +
config.daemons[i][1] + '\'")) print $0}\'',
function( error, stdout, stderr )
{
console.log(config.daemons[i]);
});
}
}
我得到的回应是:
undefined
undefined
undefined
我真的不想使用 GLOBAL 变量,你们能想出另一种方法来解决我的问题吗?
谢谢! =]
最佳答案
由于执行的异步顺序,这是很多人遇到的问题。
您的 for 循环将从 0-3 开始查找,然后在 'i' 为 4 时退出,显然。这里要记住的难点是您对 exec 的回调不会立即运行。仅在进程启动后运行,到那时,for 循环将完成。
这意味着从本质上讲,在您的回调函数运行的所有 3 次中,您实际上都在这样做:
console.log(config.daemons[4]);
这就是它打印“未定义”的原因。
您需要通过将循环内容包装在一个匿名的自执行函数中来在新范围内捕获“i”值。
function getDaemonStatus( ) {
for(var i=0; i<config.daemons.length; i++) {
(function(i) {
child.exec( 'ps ax -o \'%c %P\' | awk \'{if (($2 == 1) && ($1 == "\'' +
config.daemons[i][1] + '\'")) print $0}\'',
function( error, stdout, stderr ) {
console.log(config.daemons[i]);
});
})(i);
}
}
另外,我看到您的函数名为“getDaemonStatus”。请记住,由于 exec 回调是异步的,这也意味着您无法收集每个回调的结果,然后从 getDaemonStatus 返回它们。相反,您需要传递自己的回调,并从您的 exec 回调中调用它。
更新
请注意,每次迭代都有一个范围的最简单方法是使用 forEach
,例如
function getDaemonStatus( ) {
config.daemons.forEach(function(daemon, i){
child.exec( 'ps ax -o \'%c %P\' | awk \'{if (($2 == 1) && ($1 == "\'' +
daemon[1] + '\'")) print $0}\'',
function( error, stdout, stderr ) {
console.log(daemon);
});
}
}
关于javascript - 在 Node.js 中将变量传递给回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8026853/