与异步功能混淆

时间:2014-09-03 09:40:48

标签: node.js asynchronous

请注意,对于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 个答案:

答案 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模块。