我正在使用d3js v4来读取和读取csv文件。我没有使用任何框架。只需使用它就像在这里显示的那样:https://github.com/d3/d3-fetch/blob/master/README.md#csv
我注意到在所有示例中,他们只是将其发送到控制台。日志和我真的需要保持数据存储在对象中。
如果我在回调中执行console.log()它会打印它们,所以我知道它正在读取文件并带来数据,但即使我在里面创建了一个变量,或者我使用了一个来自'this'的变量,或将值复制到一个对象,它都失败了。这不是因为异步性,因为文件被读取并且它起作用,然后它超出了范围。我需要将它保存在d3.csv的范围之外。
一个简单版本的代码,有两个选项可以尝试复制已解析的CSV对象。
containerobject = {
readCSV: function (astring, thecsv) {
console.log(astring);
console.log(thecsv);
var answer; //I want to store the parsed csv here
var request = d3.csv(
thecsv,
function (d) {
return {
name: d.name,
x: Number(d.x),
y: Number(d.y)
};
},
function (rows) {
if (rows === undefined || rows === null) {
alert('error');
}
if (astring == "one") {
answer = d3.nest()
.key(function (d) { return d.letters; })
.entries(rows); //console.log(answer); This prints
} else if (astring == "two") {
answer = Object.assign({},(function(){ return d3.nest()
.key(function (d) { return d.letters; })
.entries(rows);}())); //console.log(answer); This prints
}
}
);
console.log("answer", answer); // this is undefined
return answer;
}
}
注意:有时会发生这种情况,最近都在运行,现在却没有。
谢谢大家
答案 0 :(得分:1)
问题是
var request = d3.csv(...)
是一个ajax调用。
因此,在调用readCSV
时,返回答案将没有任何价值。
我建议您使用承诺:
containerobject = {
readCSV: function (astring, thecsv) {
console.log(astring);
console.log(thecsv);
var answer; //I want to store the parsed csv here
var promise = new Promise(function(resolve, reject){
var request = d3.csv(
thecsv,
function (d) {
return {
name: d.name,
x: Number(d.x),
y: Number(d.y)
};
},
function (rows) {
if (rows === undefined || rows === null) {
promise.reject('error');
}
if (astring == "one") {
promise.resolve(d3.nest()
.key(function (d) { return d.letters; })
.entries(rows));
} else if (astring == "two") {
promise.resolve(Object.assign({},(function(){ return d3.nest()
.key(function (d) { return d.letters; })
.entries(rows);}())))
}
}
);
})
return promise;
}
}
更改2
现在在你调用读取CSV的位置添加然后回调以获取从ajax返回的对象。
containerObject.readCSV().then(function(data) {
//do your stuff with csv parsed data.
})
的工作示例