我想使用API来获取价格数据。我需要发送100个请求,每个请求之间都需要延迟。不会得到429错误。我如何以实际的方式实现这一目标。我正在使用NodeJS。
/* Get Sparkline data from CoinGecko*/
function getSparklineData (marketDataUSD) {
return new Promise((resolve, reject) => {
//Get sparkline for every id in marketDataUSD
marketDataUSD.forEach((coin) => {
// Get API market data from CoinGecko
let reqSparklineDataUSD = unirest("GET", "https://api.coingecko.com/api/v3/coins/"+coin.id+"/market_chart?vs_currency=usd&days=24hours");
//Wait for response from CoinGecko
reqSparklineDataUSD.end((resSparklineDataUSD) => {
//Checking for request errors
if (!resSparklineDataUSD.error) {
console.log(coin.id)
// console.log(resSparklineDataUSD.body.prices)
resolve(resSparklineDataUSD.body)
} else {
console.log("Something went wrong:\n"+ resSparklineDataUSD.error)
reject()
}
});
});
})
}
您还没有说过要如何存储结果,但是这是一种方法,该方法适用于将它们存储在数组中的任何最新版本的Node.js。
首先,让我们做一个函数,返回一个对单个硬币的请求的promise。显然,该unirest
函数的返回值是一个承诺,因此:
async function getCoinGecko(coinId) {
const reqSparklineDataUSD = await unirest("GET", "https://api.coingecko.com/api/v3/coins/"+coinId+"/market_chart?vs_currency=usd&days=24hours");
return resSparklineDataUSD.body;
}
让我们给自己一个基于承诺的观点setTimeout
:
// A promise-enabled delay function
function delay(ms, value) {
return new Promise(resolve => setTimeout(resolve, ms, value));
}
现在,我们可以使用一个async
返回结果数组承诺的函数(例如):
async function getSparklineData(marketDataUSD) {
const results = [];
let first = true;
for (const {id} of marketDataUSD) {
if (first) {
// Don't delay on the first loop
first = false;
} else {
// Delay on the second loop onward
await delay(lengthOfDelayInMS);
}
// Get this result
results.push(await getCoinGecko(id));
}
return results;
}
或者这是最后一个函数的版本,该函数返回Map
硬币ID => data的承诺:
// An async function returns a promise and can use `await` to wait for promises
async function getSparklineData(marketDataUSD) {
const results = nw Map();
let first = true;
for (const {id} of marketDataUSD) {
if (first) {
// Don't delay on the first loop
first = false;
} else {
// Delay on the second loop onward
await delay(lengthOfDelayInMS);
}
// Get this result
results.set(id, await getCoinGecko(id));
}
return results;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句