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

Sto*_*per 17 javascript d3.js

我正在尝试从D3中的CSV文件加载数据; 我有这个代码:

function update (error, data) {
    if (error !== null) {
        alert ("Couldn't load the dataset!");
    } else {
        //do something
    };

function changeData () {
    d3.csv ("data/dataset.csv", update);
}
Run Code Online (Sandbox Code Playgroud)

如果我使用D3 v4它工作正常,但如果我切换到v5它不再工作.有人可以向我解释如何修改代码以使其适用于D3 v5吗?

pmk*_*kro 36

d3 v5使用fetch API并返回需要以下代码的promise.

d3.csv('yourcsv.csv')
  .then(function(data) {
      // data is now whole data set
      // draw chart in here!
  })
  .catch(function(error){
     // handle error   
  })
Run Code Online (Sandbox Code Playgroud)

如果将来人们想要v4.另一方面,d3 v4使用XMLHttpRequest方法,并且不返回需要此代码的promise

d3.csv('yourcsv.csv', function(data) {
    //whole data set
    // draw chart here
})
Run Code Online (Sandbox Code Playgroud)

csv加载是异步的,因此请确保在csv函数中运行图表代码.

  • @Bananasaurus如果响应*不正常*,即200-299以外的HTTP状态,则返回的承诺将被拒绝.您可以使用[`.catch()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch)来处理这些错误.D3不会报告任何其他错误,也不会让您访问"Response"对象.这已被提出作为[问题](https://github.com/d3/d3-fetch/issues/7),但遭到Mike Bostock的拒绝,如果需要进一步的话,他鼓励使用Fetch API错误处理. (2认同)

hum*_*uzz 7

@pmkro 的回答很好,但是如果您想使用 ES7 async / await而不是 Promise.then:

async function doThings() {
  const data = await d3.csv('yourcsv.csv');
  // do whatever with data here
}

doThings();
Run Code Online (Sandbox Code Playgroud)