请注意,对于Node.js,我是一个完全的菜鸟。
我创建了一个WebSockets应用程序,它将在客户端连接时每秒发送服务器状态和使用情况(通过基本身份验证,以便只有授权客户端可以联系)。
我想将磁盘使用信息添加到数据中,并使用nodejs-disks模块。这是我为获取所需信息而创建的功能:
function getDiskStats()
{
var output = {
count: 0,
space: {
total: 0,
used: 0,
free: 0
}
};
df.drives(function(err, drives)
{
df.drivesDetail(drives, function(err, data)
{
output.count = data.length;
for(var i = 0; i < data.length; i++)
{
output.space.total += parseInt(data[i].total);
output.space.used += parseInt(data[i].used);
output.space.free += parseInt(data[i].available)
}
});
});
return output;
}
但是当返回输出时,一切都是0,如果我在for
循环之后立即在控制台中记录变量,我得到了值。我的猜测是因为异步方法nodejs-disks
用来获取数据。我不确定接下来应该做什么,我已经谷歌了很多,但无法找到一个好的解决方案。
谢谢!
答案 0 :(得分:2)
就像@mevernom所说的那样,在任何异步对象都有机会工作之前,你将返回你的对象。
您可以修改函数以异步工作,方法是让getDiskStats
函数在其他所有操作完成后调用它所调用的回调函数。
function getDiskStats(callback) {
var output = {
count: 0,
space: {
total: 0,
used: 0,
free: 0
}
};
df.drives(function(err, drives) {
if (err) return callback(err); // stop on error
df.drivesDetail(drives, function(err, data) {
if (err) return callback(err); // stop on error
output.count = data.length;
for(var i = 0; i < data.length; i++) {
output.space.total += parseInt(data[i].total);
output.space.used += parseInt(data[i].used);
output.space.free += parseInt(data[i].available)
}
// done processing, call callback
callback(null, output);
});
});
}
然后你必须使用像
这样的功能getDiskStats(function(err, value) {
// do stuff!
});
答案 1 :(得分:1)
因为您的getDistStats
会在回调完成任务之前立即返回。
如果您对异步性质不满意,也许可以试试async模块。