如何将JS异步生成器函数的预加载触发阈值设为500条日志
解决方案:修改异步生成器的预加载触发条件
下面是调整后的代码,核心改动是修改预加载的触发逻辑,同时优化了区块范围计算和循环退出条件:
async function* getSwaps(project, fromBlock, toBlock, limit) { const endBlock = toBlock; let logs = []; let queue = []; do { // 当当前日志存量不足500条、队列无正在加载的任务,且还有未加载的区块时,触发预加载 if (logs.length < 500 && !queue.length && fromBlock <= endBlock) { const nextToBlock = Math.min(fromBlock + limit, endBlock); // 发起批量加载请求,将promise加入队列 queue.push(project.getSwaps(fromBlock, nextToBlock)); // 更新下一批加载的起始区块 fromBlock = nextToBlock + 1; } // 当当前日志耗尽,且队列有已完成的加载任务时,取出结果 if (logs.length === 0 && queue.length > 0) { logs = await queue.shift(); } // 每次输出一条日志,避免产出undefined if (logs.length > 0) { yield logs.shift(); } } while (logs.length > 0 || fromBlock <= endBlock || queue.length > 0); }
关键改动说明
- 预加载触发条件调整:把原有的仅队列空时加载,改成当前缓存日志不足500条+队列无加载任务+还有未加载区块的复合条件,实现提前预加载,避免日志耗尽后等待。
- 区块范围计算优化:用临时变量
nextToBlock计算每次加载的结束区块,不再修改传入的toBlock参数,逻辑更清晰不易出错。 - 循环条件增强:新增
queue.length > 0判断,确保队列中所有加载请求都处理完毕后才退出循环,不会遗漏最后一批日志。 - 空日志防护:增加
logs.length > 0判断后再执行yield,避免在日志临时为空时产出undefined。
内容的提问来源于stack exchange,提问作者MrCoinSiX
相关产品推荐
相关产品推荐

