Tengo una serie de ID de monedas criptográficas que necesito enviar en una llamada a la API para obtener datos de cada moneda. ¿Cómo lo itero y envío una llamada a la API?
La matriz de ID que se almacena:
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), ]) ); }; La API de detalles de la moneda. El {coin_id} es donde necesito iterar y enviar llamadas de API contra cada ID.
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); } };Al final, necesito almacenar todos los datos de monedas en un objeto colectivo:
const fetchCoinData = async () => { setLoading(true); const fetchedCoinData = await getCoinsData(); setData(fetchedCoinData); setLoading(false); };Usar la API de CoinGecko de forma recursiva cuando está en una versión gratuita es un poco complicado. Si revisa esta documentación de la API , verá una declaración que dice que tienen un límite de velocidad para sus llamadas a la API.
Our Free API* has a rate limit of 50 calls/minute.
He reescrito un código de trabajo para buscar todas las monedas y obtener sus ID, luego llamo recursivamente a la API de CoinGecko para esas ID con un intervalo de 3 segundos entre cada llamada a la API, lo que hace que nuestra tasa de llamadas sea de 20 llamadas por minuto.
Aquí está el código para el mismo:
Nota: puede modificar esto para que encaje con reaccionar para establecer el estado y todo. Actualmente, esto se puede ejecutar directamente con el nodo.
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();