Ошибка возврата объекта Javascript - PullRequest
0 голосов
/ 14 января 2019

ОБНОВЛЕНИЕ: я понял это. Спасибо 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 (). Первая часть этого скрипта работает как положено - строит массив доменных имен на основе «domainColumnName» в предоставленном CSV-файле. Однако вторая часть, где мы на самом деле строим объект «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: Невозможно прочитать свойство 'домен' из неопределенного"

Итак, возвращаемый объект поступает как неопределенный ...

1 Ответ

0 голосов
/ 14 января 2019

Вы не возвращаете обещание из своей функции, поэтому вы получите 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);
});
...