使用d3(v3或v4)读取CSV,保存数据和回调

列索罗扎诺夫

我正在使用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;
    }
}

注意:有时可能会发生这种情况,最近都在起作用,而现在却没有。

谢谢你们

西里尔·谢里安(Cyril Cherian)

问题是var request = d3.csv(...)ajax调用。因此,readCSV调用时返回答案将没有任何价值

我建议您使用promise

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

现在在调用read CSV的地方添加然后回调以获取从ajax返回的对象。

containerObject.readCSV().then(function(data) {
 //do your stuff with csv parsed data.
})

一个可行的承诺示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章