2014-09-03 142 views
1

请注意,我是一个总的小白,当谈到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用于获取数据。我不确定接下来应该做什么,我有很多谷歌,但找不到一个好的解决方案。

谢谢!

回答

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! 
}); 
+0

从来没有想过......大声笑...另一件事:我必须使用回调中的WS Server的sendText函数,对吧?因为如果在函数外部调用输出,它仍然是异步的,并且磁盘细节仍然为空。 – sikhlana 2014-09-04 09:37:02

1

因为你getDistStats立即返回,回调完成了他们的任务之前。 如果您对异步性质不满意,也许您可​​以尝试async模块。

+0

你能提供给我的工作围绕代码?谢谢! – sikhlana 2014-09-03 13:51:22