每个API请求之间的延迟

攻击战争

我想使用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()
                }
            });
        });
    })
}
TJ人群

您还没有说过要如何存储结果,但是这是一种方法,该方法适用于将它们存储在数组中的任何最新版本的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章