首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >迭代in以发送API调用

迭代in以发送API调用
EN

Stack Overflow用户
提问于 2022-01-15 13:02:50
回答 1查看 67关注 0票数 0

我有一个密码硬币in数组,我需要在API调用中发送这些in,以获取针对每个硬币的数据。我如何迭代它并发送API调用?

正在存储的ID数组:

代码语言:javascript
运行
复制
const getIds = async () => {
  Axios.get(
    "https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&order=market_cap_desc&per_page=100&page=1&sparkline=false"
  ).then((response) =>
    setCoinIds((coinIds) => [
      ...coinIds,
      ...response.data.map((res) => res.id),
    ])
  );

};

硬币细节API。{coin_id}是我需要迭代和发送针对每个ID的api调用的地方。

代码语言:javascript
运行
复制
export const getCoinsData = async () => {
  try {
    const response = await Axios.get(
      "https://api.coingecko.com/api/v3/coins/${coin_id)"
    );
    return response.data;
  } catch (e) {
    console.log(e);
  }
};

最后,我需要将所有硬币数据存储在一个集体对象中:

代码语言:javascript
运行
复制
const fetchCoinData = async () => {
    setLoading(true);
    const fetchedCoinData = await getCoinsData();
    setData(fetchedCoinData);
    setLoading(false);
  }; 
EN

回答 1

Stack Overflow用户

发布于 2022-01-15 14:21:51

在免费版本时递归地使用CoinGecko的API是有点棘手的。如果你通过这个API文档,你会看到一条声明说他们的API调用有利率限制。

Our Free API* has a rate limit of 50 calls/minute.

我重写了一个工作代码,以获取所有硬币并获取它们的IDs,然后递归地调用CoinGecko对这些ids的API,在每个API调用之间间隔3秒,这使我们调用20个调用/分钟的速率。

下面是相同的代码:

注意-您可以修改它以适应对set状态的反应。目前,这可以直接与节点一起运行。

代码语言:javascript
运行
复制
import axios from "axios";
const instance = axios.create({
    baseURL: "https://api.coingecko.com/api/v3",
});

const delay = async (ms = 3000) => {
    return new Promise((resolve) => setTimeout(resolve, ms));
};

let coinIds = [];
const getIds = async () => {
    try {
        const response = await instance.get(
            "/coins/markets?vs_currency=usd&order=market_cap_desc&per_page=100&page=1&sparkline=false"
        );
        coinIds = [...coinIds, ...response.data.map((coin) => coin.id)];
        console.log(" ~ file: apiCall.js ~ line 14 ~ getIds ~ coinIds", coinIds);
    } catch (e) {
        console.log(" ~ file: apiCall.js ~ line 17 ~ getIds ~ e", e.message);
    }
};

const getCoinsData = async (coin_id) => {
    console.log(
        " ~ file: apiCall.js ~ line 22 ~ getCoinsData ~ coin_id",
        coin_id
    );
    try {
        const response = await instance.get(`/coins/${coin_id}`);
        return response.data;
    } catch (e) {
        console.log(
            " ~ file: apiCall.js ~ line 26 ~ getCoinsData ~ e",
            e.message
        );
    }
};

const fetchCoinData = async () => {
    try {
        await getIds();
        coinIds = coinIds.slice(0, 4);
        // uncomment below to call API concurrently (if on paid version)
        // const fetchedCoinData = await Promise.all(coinIds.map((coinId) => getCoinsData(coinId)))

        // if on free version use this
        const fetchedCoinData = await coinIds.reduce(
            (acc, coinId) =>
                acc.then(async () => {
                    await delay();
                    const coinData = await getCoinsData(coinId);
                    return coinData;
                }),
            Promise.resolve()
        );
        console.log(
            " ~ file: apiCall.js ~ line 33 ~ fetchCoinData ~ fetchedCoinData",
            fetchedCoinData
        );
    } catch (e) {
        console.log(
            " ~ file: apiCall.js ~ line 36 ~ fetchCoinData ~ e",
            e.message
        );
    }
};

fetchCoinData();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70721687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档