Почему push() не работает внутри цикла?

У меня есть код:

  var cdata = [];

  d3.text("tests.info", function(text) {
    var data = d3.csv.parseRows(text);
    data.forEach(function(d) {
        cdata.push({key: d[0],values: []}
      );
    });
  });

Он читает в файле CSV и затем циклически перебирает строки перед добавлением их в массив. Я использовал журналы, чтобы убедиться, что данные добавляются правильно, так что это нормально.

Проблема в том, что если я попытаюсь получить доступ к массиву впоследствии, он будет пустым, как если бы данные никогда не добавлялись (хотя я знаю, что это не так).

Я думаю, что это как-то связано со сферой, но я подумал, что push() должен работать таким образом, независимо.

2 ответа

Решение

Пробовать console.log внутри функции тайм-аута или поместите кнопку, которая отображает содержимое cdata, и вы увидите, что он не пустой. Как сказал Пойнти, что происходит:

  • Вы объявляете cdata

  • Вы начинаете загрузку test.info

  • Вы отображаете содержимое cdata

  • test.info загружен, вы начинаете цикл и помещаете данные в ваш массив

Вам нужно вернуть cdata:

d3.text("tests.info", function(text) {
  var data = d3.csv.parseRows(text), cdata = [];
  data.forEach(function(d) {
    cdata.push({key: d[0],values: []};
  });
  return cdata;
});

Рассмотрим также просто делать

d3.text("tests.info", function(text) {
  return d3.csv.parseRows(text).map(function(d) {
    return {key: d[0], values: []};
  });
});
Другие вопросы по тегам