Почему 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: []};
});
});