javascript - 使用 d3.json() 获取数据不起作用,而使用 JS async wait 则可以。为什么?

标签 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 在这里不是问题。

非常感谢您的见解。

最佳答案

根据the documentationd3.json 返回一个 Promise,就像 fetch 一样,而不是接受回调。 (编辑:显然在 v4 中它接受了回调——这解释了这一点。)如果您使用该 promise ,它就会起作用。

您可以像使用 fetch 一样通过 async/await 使用 Promise,也可以使用 then 并且(因为您不会将链返回给任何可以处理它的其他人)catch

异步/等待:

(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>

然后/捕获:

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>

关于javascript - 使用 d3.json() 获取数据不起作用,而使用 JS async wait 则可以。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56539366/

相关文章:

javascript - 在 Chrome 中调整 div 大小的问题

javascript - 在 d3.js 中从 CSV 中选择一段数据

d3.js - 如何使用 d3.js 绘制只有外半径或圆扇区的圆弧?

javascript - D3 同心/嵌套圆环图

javascript - 如何在基于聚类的树状图中设置颜色?

javascript - 这个 highcharts.js 代码有什么问题?

javascript - 如何使用javascript根据输入值突出显示相关数字范围?

javascript - Knockout + Ajax Content 导致多个绑定(bind)错误

javascript - 即使在删除了 JavaScript 事件处理程序所绑定(bind)的 DOM 元素后,内存中是否仍存在该事件处理程序?

javascript - 如何重绘图表: d3. js链接函数和crossfilter过滤