首页 > 解决方案 > Javascript 对象返回失败

问题描述

更新:我已经想通了。感谢eol让我想到了承诺。虽然推荐的脚本没有让我到达那里,但我的想法却做到了。

为了让对象正确通过,我需要从对象本身开始,并重组代码以支持该目的。

var barBuildX = function(csv, domainColumnName, rangeMin, rangeMax, paddingInner, paddingOuter) {
 var x = {
    rMin: rangeMin,
    rMax: rangeMax,
    padIn: paddingInner,
    padOut: paddingOuter,
    domain: (function() {
         var dom = [];
         d3.csv(csv).then(function(data) {
            data.forEach(function(d) {
            dom[dom.length] = d[domainColumnName];
            });
         })
         return dom;
      })(),
    };
    console.log(x);
    return x;
    };
 };

这是一个相当基本的子例程,旨在用满足 d3.js scaleBand() 函数所需的字段填充对象。该脚本的第一部分按预期工作 - 根据提供的 CSV 文件中的“domainColumnName”构建一个域名数组。然而,第二部分,我们实际构建将返回的“x”对象,没有正常运行 - 没有写入控制台或带回我试图传递给它的任何数据。这尤其令人讨厌,因为它应该只是设置属性值并返回对象以在其他地方使用......有什么想法吗?

var barBuildX = function(csv, domainColumnName, rangeMin, rangeMax, paddingInner, PaddingOuter) {
  var dom = [];
  d3.csv(csv).then(function(data) {
    console.log(data); //this works
    data.forEach(function(d) {
      dom[dom.length] = d[domainColumnName];
    });
    console.log(dom); //this works
    var x = {
      domain: dom,
      rMin: rangeMin,
      rMax: rangeMax,
      padIn: paddingInner,
      padOut: paddingOuter
    };
    console.log(x); //this DOES NOT work
    return x; //Undefined... / Type Error
  });
};

变量拼写有差异,不幸的是我在复制到这个线程时犯了一个错误。在无效的原始来源中,变量拼写没有差异。

我在 Chrome 控制台中收到的错误消息是:“Uncaught TypeError: Cannot read property 'domain' of undefined”

所以,返回对象是未定义的......

标签: javascriptobjectpropertiesreturnclosures

解决方案


你没有从你的函数中返回承诺,这就是为什么你会得到undefined一个返回值。做这样的事情:

var barBuildX = function(csv, domainColumnName, rangeMin, rangeMax, paddingInner, PaddingOuter) {
  var dom = [];
  return d3.csv(csv).then(function(data) {
    console.log(data); //this works
    data.forEach(function(d) {
      dom[dom.length] = d[domainColumnName];
    });
    console.log(dom); //this works
    var x = {
      domain: dom,
      rMin: rangeMin,
      rMax: rangeMax,
      padIn: paddingInner,
      padOut: paddingOuter
    };
    console.log(x); //this DOES NOT work
    return x; //Undefined... / Type Error
  });
};

// how to invoke the function:
barBuildX(...).then(x => {
   console.log(x);
});

推荐阅读