【问题标题】:How to import JSON file to hold within a javascript variable [duplicate]如何导入JSON文件以保存在javascript变量中[重复]
【发布时间】:2022-01-28 07:22:32
【问题描述】:

我一直在寻找几个小时来创建一个 javascript 变量来保存来自导入的 JSON 对象的数据。我找不到任何可以帮助我弄清楚的东西。每次我搜索这个主题时,它都会让我看到有关如何在 js 中启动 JSON 文件以供外部使用的教程。我正在尝试将变量与带有 D3.js 的 JSON 对象一起使用。这是我上次尝试的基本代码:

const dataset =
  document.addEventListener('DOMContentLoaded', function(){
    fetch('https://raw.githubusercontent.com/freeCodeCamp/ProjectReferenceData/master/GDP-data.json')
      .then(response => response.json())
      .then(data => data.data);
  });
console.log(dataset);

我知道我可以将console.log 放在fetch().then() 方法中,但是为了以我想要的方式将它与D3.js 一起使用,它需要是一个全局变量。我试图在fetch() 方法中初始化变量,但这不允许我在全局范围内使用它。我也试过这种代码:

var dataset = [];
  document.addEventListener('DOMContentLoaded', function(){
    fetch('https://raw.githubusercontent.com/freeCodeCamp/ProjectReferenceData/master/GDP-data.json')
      .then(response => response.json())
      .then(data => dataset = data.data);
  });
console.log(dataset);

如您所料,数据集仍然是一个空数组。

---更新---
这是codepen项目: https://codepen.io/critchey/pen/YzEXPrP?editors=0010

【问题讨论】:

  • 使用 setIterval 并检查 'dataset' 直到它有值,但我确信 d3js 有办法从 .then 调用它的方法来加载数据
  • “数据集仍然是一个空数组”,因为您在填充数据之前对其进行了记录。您对 console.log 的调用发生在 fetch/then 发生之前。

标签: javascript d3.js fetch fetch-api


【解决方案1】:

这个应该可以的:

const dataset = await fetch('https://raw.githubusercontent.com/freeCodeCamp/ProjectReferenceData/master/GDP-data.json')
  .then(response => response.json())
  .then(data => data.data);

另一种方式是:

let dataset;
fetch('https://raw.githubusercontent.com/freeCodeCamp/ProjectReferenceData/master/GDP-data.json')
  .then(response => response.json())
  .then(data => dataset = data.data);

但数据集的值将在此代码之后不可用,但一旦 Promise 被解决。因此,您应该在 fetch 之前添加 await 以等待 Promise。

【讨论】:

  • 做到了!谢谢!我使用了await 并收到警告说await 只能在async 函数中使用。所以我研究了一下,想出了这个:` async function imprt() { const dataset = await fetch('raw.githubusercontent.com/freeCodeCamp/ProjectReferenceData/…) .then(response => response.json()) .then(data => data 。数据);返回数据集; } 常量数据集 = imprt(); console.log(dataset) ` 谢谢,这帮了很多忙。我不熟悉 await。
  • 这里是代码笔,使它更容易:codepen.io/critchey/pen/YzEXPrP?editors=0010。其实我还是有问题的。该代码返回为Promise {<pending>}[[Prototype]]: Promise[[PromiseState]]: "fulfilled"[[PromiseResult]]: Array(275) 正如您所看到的,它返回了 Promise 的状态......随着时间的推移,我认为......然后它最终返回结果......这真的很令人困惑。当我在函数中调用console.log(dataset) 时,它在控制台中显示为我正在寻找的对象。但是,如果我将 console.log 排除在功能之外,它只会以上面的格式显示。
  • 现在我可以看到您想要实现的目标。通常,您无法在脚本的根目录中运行 await - 只有异步函数才能执行此操作,直到它成为模块。你如何运行这个脚本?是命令行吗?如果是,则将其重命名为 .mjs,您可以使用 node script.mjs 运行它。通过这种方式,您可以使用 await 运行异步函数: const datset = await imprt();在脚本的根目录中。或者 const dataset = await fetch(...)。
  • 我最终只是在 async 函数中添加了 D3.js。我不想走那条路,但它似乎是我能找到的最常用的方法。
猜你喜欢
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 2021-02-23
  • 2020-12-27
  • 2014-09-13
  • 2019-08-25
  • 2016-10-25
  • 2015-08-29
相关资源
最近更新 更多