用闭包实现带优先级的任务队列,核心是封装tasks数组与排序逻辑,对外仅暴露add、runNext等安全接口;插入时按priority升序定位插入位置,确保shift()总取最高优任务;支持取消、延迟等可选增强。

<p>用闭包实现带优先级的任务队列,核心是把队列状态(任务数组、排序逻辑)封装在函数作用域内,对外只暴露安全的增删查接口,同时支持按优先级插入和有序执行。</p>
<h3>闭包封装队列状态与操作逻辑</h3>
<p>定义一个立即执行函数,内部维护 <strong>tasks</strong> 数组,每个任务是形如 <code>{ id, priority, fn }</code> 的对象。priority 越小默认优先级越高(可配置),插入时按 priority 升序排列,保证 <code>shift()</code> 总能取出最高优任务。</p>
<p>关键点:</p>
- 所有对 tasks 的读写都限制在闭包内,避免外部直接修改
- 插入任务时用
Array.prototype.sort()动态重排,或更高效地用二分查找插入位置(适合高频插入场景) - 提供
add(task, priority?)、runNext()、size()等方法,返回纯函数或对象方法
支持优先级的插入策略
不依赖运行时排序,而是在插入时就定位到正确位置,减少重复计算。例如:
遍历当前 tasks,找到第一个 task.priority > newTask.priority 的索引,用 splice(index, 0, newTask) 插入。这样 runNext() 只需 tasks.shift() 即可拿到最高优任务。
示例逻辑片段:
const idx = tasks.findIndex(t => t.priority > newTask.priority);
if (idx === -1) tasks.push(newTask);
else tasks.splice(idx, 0, newTask);
};
暴露安全、语义清晰的 API
闭包最终返回一个对象,包含以下方法:
- add(fn, priority = 0):接受函数和可选优先级,自动包装为任务对象并插入
-
runNext():执行队首任务(若存在),返回执行结果;无任务时返回
undefined - clear():清空队列
- size():返回当前待执行任务数
- peek():查看下一个将执行的任务(不移除)
所有方法共享同一份 tasks,但外部无法绕过 API 直接访问或修改它。
可选增强:支持延迟任务与取消机制
在基础闭包上可扩展:
- 任务对象增加
id和canceled字段,add()返回取消函数cancel() -
runNext()执行前跳过已取消任务(用while (tasks[0]?.canceled) tasks.shift();) - 加入
delay(fn, ms, priority),用setTimeout包装后插入,实现定时高优任务
这些扩展仍被闭包保护,不影响接口简洁性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











