You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中按固定间隔循环调用函数实现Coinbase Pro API单钱包每5秒轮询

问题背景

我需要每隔固定时间调用Coinbase Pro API获取钱包历史数据,受接口每秒调用频率限制,要求每5秒仅为1个钱包调用一次getWalletHistory()函数。

原有修改后的实现为每个钱包单独绑定了setInterval定时器,导致所有钱包的接口请求每5秒同时触发,不符合频率控制要求。

实现方案

核心思路是将所有钱包存入数组队列,仅使用一个全局定时器按顺序轮询调用,每次仅处理一个钱包的请求,实现代码如下:

var wallet_list = [];
// 轮询索引,记录当前要调用的钱包位置
let currentWalletIndex = 0;
// 请求锁,可选,避免接口响应慢导致请求堆积
let isRequesting = false;

getWalletList();

function getWalletList(){
    authedClient.getAccounts().then(wallet_list_response => {
        wallet_list = wallet_list_response;
        console.log('**********END LOOP WALLET LIST');
        // 启动全局轮询定时器,每5秒触发一次
        setInterval(handleWalletPoll, 5000);
        // 可选:立即触发第一次调用,不用等5秒
        handleWalletPoll();
    }).catch(error => {
        console.log('ERROR getAccounts');
    });
}

// 轮询处理函数
async function handleWalletPoll() {
    // 可选:如果上一个请求还没完成,跳过本次,避免请求堆积
    if (isRequesting) return;
    if (wallet_list.length === 0) return;

    // 取当前要处理的钱包
    const currentWallet = wallet_list[currentWalletIndex];
    // 索引+1,超出数组长度时重置为0,实现循环轮询
    currentWalletIndex = (currentWalletIndex + 1) % wallet_list.length;

    isRequesting = true;
    try {
        const order_list = await authedClient.getAccountHistory(currentWallet.id);
        console.log(`*********response order_list for ${currentWallet.currency}`);
        // 在这里处理返回的订单数据
    } catch (error) {
        console.log('ERROR getAccountHistory');
    } finally {
        // 请求完成后释放锁
        isRequesting = false;
    }
}
逻辑说明
  • 仅维护一个全局定时器,每5秒触发一次,每次仅调用1个钱包的接口,完全符合频率限制要求
  • 索引自增后对钱包总数取模,实现所有钱包循环轮询
  • 新增的请求锁为可选优化,避免网络波动导致接口响应慢,多个请求堆积超出频率限制

内容的提问来源于stack exchange,提问作者DamTan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:06:00