使用d3.json()获取数据无效,而使用JS async await则有效。为什么?

时间:2019-06-11 08:21:05

标签: javascript d3.js

我正在尝试从url中获取一些数据以在d3.js中使用。我无法使用d3.json(url, callback)来获取数据。当我使用(ES8)async await函数时,效果很好。

有人可以帮助我理解为什么吗?我究竟做错了什么?谢谢!

d3.json()示例:

d3.json("https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/GDP-data.json", json => {
  
     const data = json.data; // array of dates and values
     const lowestVal = d3.min(data, d => d[1]);
     const highestVal = d3.max(data, d => d[1]);
     
     console.log(lowestVal);
     console.log(highestVal);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

异步等待示例:

(async function() {
  try {
    const response = await fetch("https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/GDP-data.json");
    if (response.ok) {
      const jsonResponse = await response.json();
      
      const data = jsonResponse.data; // array of dates and values
      const lowestVal = d3.min(data, d => d[1]);
      const highestVal = d3.max(data, d => d[1]);
      
      console.log(lowestVal);
      console.log(highestVal);
    }
  } catch(error) {
    console.log(error);
  }
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

我知道这里也应该有一些CORS问题。但是我目前正在使用CodePen。因此,CORS在这里不是问题。

非常感谢您的见解。

1 个答案:

答案 0 :(得分:1)

根据the documentationd3.json返回的承诺与fetch一样,而不是接受回调。 (编辑:显然在v4中它接受了回调-对此进行了解释。)如果使用该承诺,它将起作用。

您可以像使用async一样通过await / fetch使用诺言,也可以使用then和(因为您不会将链返回到其他会处理的人)catch

async / await

(async function() {
  try {
    const jsonResponse = await d3.json("https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/GDP-data.json");

    const data = jsonResponse.data; // array of dates and values
    const lowestVal = d3.min(data, d => d[1]);
    const highestVal = d3.max(data, d => d[1]);

    console.log(lowestVal);
    console.log(highestVal);
  } catch(error) {
    console.log(error);
  }
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

then / catch

d3.json("https://raw.githubusercontent.com/FreeCodeCamp/ProjectReferenceData/master/GDP-data.json")
.then(json => {
  
     const data = json.data; // array of dates and values
     const lowestVal = d3.min(data, d => d[1]);
     const highestVal = d3.max(data, d => d[1]);
     
     console.log(lowestVal);
     console.log(highestVal);
})
.catch(error => {
    console.error(error);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>