与asynchronousfunction混淆

请注意,当谈到Node.js时,我总是noob。

我创build了一个WebSockets应用程序,当客户端连接时(通过基本身份validation,只有授权的客户端可以联系),才会每秒发送服务器状态和用法。

我想添加磁盘使用信息的数据,并使用nodejs-disks模块。 这是我创build的function,以获得我需要的信息:

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循环后loginvariables在控制台中我得到的值。 我的猜测是,因为nodejs-disks用来获取数据的asynchronous方法。 我不知道接下来应该做什么,我有很多谷歌,但找不到一个好的解决scheme。

谢谢!

就像@mevernom所说的,在任何asynchronous对象有机会工作之前,你都要返回对象。

你可以通过让你的getDiskStats函数进行一个callback来修改你的函数asynchronous工作。

 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); }); }); } 

你将不得不使用你的function

 getDiskStats(function(err, value) { // do stuff! }); 

因为你的getDistStats立即返回,在callback完成任务之前。 如果您对asynchronous本质不熟悉,也许可以尝试asynchronous模块。