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
相关产品推荐
相关产品推荐

