【问题标题】:Stuck with JSON API Call in Javascript卡在 Javascript 中的 JSON API 调用
【发布时间】:2021-03-28 11:55:54
【问题描述】:

我正在尝试构建一个计算器,您可以在其中选择不同的加密货币并构建一个用于测试和跟踪的投资组合。为此,我选择 Coingecko API v3 并使用 Fetch 进行 API 调用。 https://www.coingecko.com/en/api

API 调用正常工作,我从服务器获取 JSON 数据。我构建了一个传递前 100 名硬币的函数,将它们放入 Datalist-Tag 中以便从输入中进行选择:

function fetch_coinlist(url) {
  fetch(url)
    .then(function(response) {
      if (response.status !== 200) {
        alert("Can Not get Price Api! Status: " + response.status);
        return;
      }

      response.json().then(function(data) {
        document.getElementById("coinlist").innerHTML = "";

        for (i = 0; i <= 99; i++) {
          const toplist = document.createElement("option");

          toplist.id = data[i].symbol;

          toplist.innerHTML =
            data[i].symbol.toUpperCase() + " - " + data[i].name;

          document.getElementById("coinlisting").appendChild(toplist);

          //console.log(data[i].id);
          //console.log(data[i].name);
          //console.log(data[i].symbol);
          //console.log(data[i].image);
          //console.log(data[i].current_price);
        }
      });
    })
    .catch(function(err) {
      alert("Can Not get Price Api! Status: " + err);
    });
}
<input list="coinlisting" id="coinlist" name="coinlist" class="curser-choose" />
<datalist id="coinlisting" placeholder="Choose Coin"></datalist>

这是有效的,我正在使用 For 循环来处理响应。如果用户从该 Datalist 中选择了一个选项,我会尝试显示硬币的价格,为了获得更多功能,我认为最好调用像 data.coinname.current_price 这样的对象,这样我就可以构建一个可以传递字符串的函数到它那里并得到那个硬币的价格。

但是,现在我必须将 data[0].current_price 用于列表中第一项的current Price。被调用列表上的项目会随着时间而改变,所以我不能进行静态分配,我想我每次调用 API 时都可以这样做,但是拥有一个可以用名称提供的函数对我的目标没有好处作为一个字符串来进行价格调用。

可以在与列表相同的调用中获得价格,但我无法弄清楚我将如何做到我的想法。在 API 的网站上列出了不同的调用,第一个是 /coins/list 调用,它说“使用它来获取所有硬币的 id 以进行 API 调用”并为每个可用的 JSON 对象硬币之类的:

{
  "id": "1inch",
  "symbol": "1inch",
  "name": "1inch"
} 

我是否需要先进行此调用才能实现我的想法?但我不确定这将如何帮助我获得我正在寻找的解决方案......我正在努力寻找解决方案并感到困惑,我觉得我没有正确理解它,它应该不那么难我认为现在是这样:D 如果您知道如何完成此操作,请告诉我!

【问题讨论】:

  • 这跟CSS有什么关系?请不要添加不必要的标签。
  • 让人们回答你的问题。尝试像这样简化:我有这个问题。我试过这个。错误就是这样。添加如下内容:“我为此选择 Coingecko API v3 并使用 Fetch 进行 Api 调用。coingecko.com/en/api”它会产生一个臃肿的未回答问题
  • 您的代码没有运行。你需要url="https://api.coingecko.com/api/v3/coins/list";
  • 嗨,对不起,这是我的第一篇文章,我在这个项目中使用了 CSS,所以我将它添加到其中,API Url 已传递给函数,因此我可以将它与按钮一起用于调试。感谢您的提示!

标签: javascript coingecko


【解决方案1】:

你可以做这样的事情。我保持 html 简单。

  • fetch_coinlist:获取硬币列表。在获取硬币列表后,它将结果转换为对象而不是列表。每个硬币都可以使用coins["&lt;coin id&gt;"]访问。
  • show_coinlist 进行可视化
  • addEventListener 在您选择项目时捕获。

const gecko = "https://api.coingecko.com/api/v3/";
var coins = {};

// selector actions
const selector = document.querySelector('#coinlisting');
const info = document.querySelector('#info');
selector.addEventListener('change', event => {
  info.innerHTML = "Selected item: " + selector.value + " : " + coins[selector.value].name;
});

function fetch_coinlist() {
  fetch(gecko + "coins/list")
    .then(function(response) {
      if (response.status !== 200) {
        alert("Can Not get List Api! Status: " + response.status);
        return;
      }

      response.json().then(function(data) {
        coins = {};
        for (let i = 0, l = data.length; i < l; i++) {
          let {id, ...info} = data[i];
          coins[id] = info;
        }
        show_coinlist();
      });
    })
    .catch(function(err) {
      alert("Can Not get Price Api! Status: " + err);
    });
}
function show_coinlist(){
  for (let id in coins) {
    let item = coins[id];
    const toplist = document.createElement("option");
  
    toplist.value = id;
    toplist.innerHTML = item.symbol.toUpperCase() + " - " + item.name;
    document.getElementById("coinlisting").appendChild(toplist);
  }
}

fetch_coinlist();
    <select id="coinlisting" placeholder="Choose Coin"></select>
    <div id="info"></div>

【讨论】:

  • 谢谢凯文 Verstrate!这很好用!对不起,小问题,我现在有另一个问题,我尝试找到一个解决方案,为动态添加的 Div ID 提供多个动态选择器,但我只得到“未捕获的类型错误:无法读取属性 'appendChild' of null”
猜你喜欢
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 2012-09-23
  • 2021-08-16
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多