d3 csv在回调后丢弃数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了d3 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;
    }
}

注意:有时会发生这种情况,最近全部都在工作,现在却没有。

谢谢你们

答案

问题是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.
})

promise的一个工作示例

以上是关于d3 csv在回调后丢弃数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 D3 v5 中从 CSV 文件加载数据

在 D3 中读取没有标题行的 csv/tsv

将 d3.csv 方法转换为 d3.csv.parse 方法

D3 在回调期间为用户定义的输入获取 NULL

如何确保 D3 在 javascript 运行之前完成加载多个 CSV?

java 只有在可见并完成初始化时才会丢弃数据的片段。