如何从函数中返回一个值,该函数是在回调函数内生成的?

时间:2014-09-15 09:51:08

标签: javascript csv d3.js

我需要编写一个函数,它将从csv文件中过滤掉相关数据并返回包含数据的数组。 csv文件包含时间作为其中一列,我想过滤掉函数参数中提供的指定开始和结束时间内的行。我编写了以下函数filter_data(另请注意,这使用了d3.js):

   <code>
    function filter_data(start_time, end_time) {
         var formatDate = d3.time.format("%H:%M"),
         parseDate = formatDate.parse;
         var data1 = [];
         d3.csv("data.txt", function(error, data) {
             data.forEach(function(d) {
                 if(parseDate(d.time) >= parseDate(start_time) && parseDate(d.time) < parseDate(end_time))
                     data1.push(d);    
             });
          return data1;
         });
    }
</code>

这背后的想法是构建可重用的代码来获取数据。但是上面的函数总是返回undefined。我故意将返回值放在回调函数中,因为我知道这将是一个异步调用(我还在最后放置return语句,但它返回空数组!)。

1 个答案:

答案 0 :(得分:1)

在这种情况下,您无法使用return。您需要将回调函数作为filter_data的参数之一传递,并使用它来返回数据。

function filter_data(start_time, end_time, callback) {
  var formatDate = d3.time.format("%H:%M"),
  parseDate = formatDate.parse;
  var data1 = [];
  d3.csv("data.txt", function(error, data) {
    data.forEach(function(d) {
      if(parseDate(d.time) >= parseDate(start_time) && parseDate(d.time) < parseDate(end_time)) {
        data1.push(d);
      }
    });
    callback(data1);
  });
}

filter_data(start_time, end_time, function (data) {
  console.log(data);
});