我有一个密码硬币in数组,我需要在API调用中发送这些in,以获取针对每个硬币的数据。我如何迭代它并发送API调用?
正在存储的ID数组:
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调用的地方。
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);
}
};
最后,我需要将所有硬币数据存储在一个集体对象中:
const fetchCoinData = async () => {
setLoading(true);
const fetchedCoinData = await getCoinsData();
setData(fetchedCoinData);
setLoading(false);
};
发布于 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状态的反应。目前,这可以直接与节点一起运行。
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();
https://stackoverflow.com/questions/70721687
复制相似问题