从异步函数返回数据

时间:2015-06-01 16:25:16

标签: javascript node.js asynchronous return

我一直在阅读很多关于回调的内容,但仍然没有得到它......

我正在执行异步功能,该功能会在数组中添加一个字符串,其中包含有关可用磁盘空间的信息。

所有这些代码都在一个脚本中,我希望能够在其他代码中使用该数组。到目前为止,我试图返回它并将其作为参数传递...但它在完成任务之前执行。

var diskspace = require('diskspace');
var fs = require('fs');
var aux;

function getDiskSpace(json){
    diskspace.check('C',function(err, total, free, status){ 
        aux=new Object();
        aux.name="diskspace";
        aux.value=(((total-free)/(1024^3)).toFixed(2)+"MB used, "+(free*100/total).toFixed(2)+"% free");
        json.push(aux);
    }); 
    aux= new Object();
    aux.name="date";
    aux.value=(new Date().toLocaleString());
    json.push(aux);
    aux= new Object();
    aux.name="arduinos";
    aux.value=JSON.parse(fs.readFileSync("./data/dirs.json","utf8"));
    json.push(aux); 
}

module.exports=getDiskSpace;

进入主程序后,我发送它就像JSON:

    var array=new Array();
    var getDiskSpace=require('./getIndexInfo.js');
    getDiskSpace(array);
    res.writeHead(200,{"Content-Type": "application/json"});
    res.end(JSON.stringify(array));

你能告诉我这样做的正确方法吗? 我知道这已经讨论了很多,但我也一直在阅读承诺,我读的越多,我就越困惑,抱歉。

1 个答案:

答案 0 :(得分:0)

对于任何asyn函数,您需要具有一个回调函数,该函数在操作完成后执行。您可以像这样修改代码并尝试。

var diskspace = require('diskspace');
var fs = require('fs');
var aux;

function getDiskSpace(cb){
    diskspace.check('C',function(err, total, free, status){ 
      var arr = [];
      var aux=new Object();
      aux.name="diskspace";
      aux.value=(((total-free)/(1024^3)).toFixed(2)+"MB used, "+(free*100/total).toFixed(2)+"% free");
      arr.push(aux);

      aux= new Object();
      aux.name="date";
      aux.value=(new Date().toLocaleString());
      arr.push(aux);

      aux= new Object();
      aux.name="arduinos";
      aux.value=JSON.parse(fs.readFileSync("./data/dirs.json","utf8"));
      arr.push(aux); 

      //Pass the array to the callback
      //In case of any error pass the error info in the first param
      cb(null, arr);
    });
}

module.exports=getDiskSpace;

用法

var getDiskSpace=require('./getIndexInfo.js');
getDiskSpace(function (err, arr) {
  ///If err is not null then send error response
  res.writeHead(200,{"Content-Type": "application/json"});
  res.end(JSON.stringify(arr));
});