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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:15:06