在递归函数中添加执行进度钩子,需在每次递归调用前或后同步触发回调函数,通过闭包维护计数状态并传入当前进度(如节点数、深度、百分比),支持返回控制信号以中断递归,异步场景下需用 queueMicrotask 保证时序一致性。

在递归函数中添加执行进度钩子,核心是让每次递归调用前或后主动触发一个回调函数,并把当前进度(如已处理节点数、深度、百分比等)传出去。关键在于钩子调用的位置要合理,且状态变量需被正确共享或传递。
钩子函数放在递归入口处最常用
适合需要“每进入一层就通知”的场景,比如遍历树结构时上报当前路径或深度。
- 把钩子作为参数传入递归函数,每次调用前执行一次
- 配合累计计数器(如全局变量、闭包变量或参数传递)计算进度
- 示例:遍历二叉树时,每访问一个节点就调用
onProgress(node, depth, total)
用闭包维护进度状态更安全
避免全局变量污染,也防止多层递归并发时状态错乱。
- 在外层函数中定义计数器和总节点数,递归函数通过闭包访问
- 钩子函数可读取当前计数并估算进度(如
count / total * 100) - 若总数量未知(如无限递归或动态生成),可用深度、步数或事件次数代替
支持中断的钩子需返回控制信号
有些场景需要根据钩子返回值决定是否继续递归(例如用户点击取消)。
- 钩子函数返回
false或特定标志,递归主逻辑据此return - 注意:必须在每次递归调用前后都检查返回值,不能只在顶层判断
- 示例:
if (onProgress(...) === false) return放在递归体开头
异步递归中钩子要兼顾时机一致性
如果递归过程涉及 Promise 或 setTimeout,钩子触发时机容易错乱。
- 钩子本身应同步执行,避免阻塞;耗时逻辑放钩子里异步处理
- 确保计数更新与钩子调用在同一个微任务内完成,防止竞态
- 推荐用
queueMicrotask或Promise.resolve().then()延迟上报,保持顺序

















