Javascript 检查D3中是否存在潜在的CSV文件问题

Javascript 检查D3中是否存在潜在的CSV文件问题,javascript,d3.js,crossfilter,file-exists,Javascript,D3.js,Crossfilter,File Exists,我有一个D3项目,它使用一个非常大的CSV文件来读取数据。它工作正常,但有时用户会因为以下问题之一而无限期地看到旋转加载图像。 我需要能够捕捉到这些问题,并向用户显示一些有意义的消息,而不是永无止境的等待消息: 当数据文件(MyData.csv)不存在时 当MyData.csv存在但为空时 当MyData.csv存在时,它不是空的,但格式不正确(更改第一行的列标题名称以进行测试) 理想情况下,我希望能够区分它们 function loadData() { d3.csv('MyMap.cs

我有一个D3项目,它使用一个非常大的CSV文件来读取数据。它工作正常,但有时用户会因为以下问题之一而无限期地看到旋转加载图像。
我需要能够捕捉到这些问题,并向用户显示一些有意义的消息,而不是永无止境的等待消息:

  • 当数据文件(MyData.csv)不存在时
  • 当MyData.csv存在但为空时
  • 当MyData.csv存在时,它不是空的,但格式不正确(更改第一行的列标题名称以进行测试)
  • 理想情况下,我希望能够区分它们

    function loadData() {
        d3.csv('MyMap.csv', function(data) {
            data.forEach(function(d) {
                doSomething()
            });
    
            // load primary data set
            d3.csv('MyData.csv', function (data) {
                doSomethingWithData(data);
            }); // main data set
        });
    };
    
    通过错误检查更新

    var ErrorEnum = Object.freeze({NOTFOUND: 1, EMPTY: 2, INVALIDFORMAT: 3});
    var mapFileName = 'MyMap_empty.csv';
    var dataFileName = 'MyData_empty.csv';
    
    function redirectOnFileError(fileName, url, errID) {
        var errTitle = errID == ErrorEnum.NOTFOUND ? "File Not Found" : (errID == ErrorEnum.EMPTY ? "Empty File" : "Invalid File Format");
        var errText = fileName + (errID == ErrorEnum.NOTFOUND ? " could not be found" : (errID == ErrorEnum.EMPTY ? " is empty" : " has invalid format"));
        console.log(errText);
    
        swal({
            title: errTitle,
            text: errText,
            type: "error",
            confirmButtonText: "OK"
            },
            function(isConfirm){
                // somehow we never get here!
                console.log("here ...");
                if (isConfirm) {
                        window.location.href = url;
                }
            }); 
            // hack ... callback function above is not executed, so using below jQuery to use "OK" button's class and 'click' it
            $('.swal2-confirm').click(function(){
                window.location.href = url;
        });
    }
    
    function loadData() {
        d3.csv(mapFileName, function (error, data) {
            if (error && error.status === 404) {
                redirectOnFileError(mapFileName, "fnf.html", ErrorEnum.NOTFOUND);
            }
            else if (data.length === 0) {
                redirectOnFileError(mapFileName, "ef.html", ErrorEnum.EMPTY);
            }
            else {
                data.forEach(function (d) {
                    // DoSomethingHere();
                });
    
            // load primary data set
            d3.csv(dataFileName, function (error, data) {
                if (error && error.status === 404) {
                    redirectOnFileError(dataFileName, "fnf.html", ErrorEnum.NOTFOUND);
                }
                else if (data.length === 0) {
                    redirectOnFileError(dataFileName, "ef.html", ErrorEnum.EMPTY);              }
                else {
                    // DomSomethingWithData();
                }); // main data set
        });
    }
    }
    };
    

    这里可以回答第一个和第二个场景(对于第三个场景,请参阅下面的PS)

    在开始之前,让我们先看看一个可用的现有CSV文件:

    d3.csv(“https://gist.githubusercontent.com/GerardoFurtado/2e9f269f7a0f56cf7e23b480afcf280a/raw/5e361753a695534915e81786013976aa94685695/csvfile.csv,函数(错误,数据){
    console.log(数据)
    });
    
    非常感谢。我将对此进行测试并将结果发回。我编辑了问题和代码,将您的建议纳入其中,但似乎我做错了什么;我在dc.js中得到了“d3未定义”,这是我以前没有得到的。我想这与我将你的代码合并到我的代码中的方式有关。我是D3/CrossFilter/DC world的新手,可能是我添加if…then…else的方式。@NoBullMan不要编辑你的答案,将我的代码放入其中:人们会认为这是你的尝试。把你的代码留在问题里。这样,人们可以根据您的代码而不是我的代码提出解决方案。另外,请记住,因为我没有看到问题中的DC标记,所以我的答案使用“纯”D3。请编辑您的问题并添加DC标签。我更新了帖子,保留了原始问题,并在其下方添加了更新的代码和您的建议。我不认为DC是相关的,因为如果文件存在并且不是空的,代码就可以工作。我丢失的是文件错误检查。我仍然有我在添加更新后提到的问题;可能是我在if…then…else语句中添加建议更改的方式(即“{”和“}:的方式)的原因。在我的代码中,我添加了其他内容,我添加了你的代码,我想我弄坏了一些东西;比如错误的大括号位置!