快速排序可视化代码中使用Promise.all()为何values列表偶现null值?
异常原因定位
- 核心问题是
partition函数内的pindex、pvalue未使用let/const声明,直接成为全局共享变量。- 使用
Promise.all并行执行两个递归快排分支时,两个并行运行的partition逻辑会互相覆盖对方的pindex、pvalue数值,导致基准点pivot的计算完全错乱,最终返回的pivot值会超出数组有效索引范围。 - 错乱的
pivot会让后续递归的start/end参数超出原数组长度,交换元素时会读取到数组范围外的undefined值(宽松相等判断下与null等价),覆盖原有有效数组元素,最终触发渲染逻辑报错。
- 使用
- 顺序
await写法下功能正常的原因:这种写法会等左分支的整个排序流程完全执行完毕后,才会启动右分支的逻辑,全局pindex、pvalue不会被中途其他逻辑篡改,所有索引计算都在数组有效范围内,不会触发越界访问。
修复方案
- 给
pindex、pvalue添加局部作用域声明,让每个运行中的partition都拥有独立的变量副本,从根源上避免并行逻辑的变量污染:async function partition(start, end){ let pindex = start; // 替换原有的全局赋值写法 state[end] = -1; let pvalue = values[end]; // 替换原有的全局赋值写法 // 后续原有逻辑保持不变 } - 可选优化项
- 修正
swep的拼写为swap,提升代码可读性 draw函数的遍历范围固定为初始数组长度,避免意外的数组长度变更引发冗余渲染- 对代码中未显式声明的全局变量(比如
n)补充let声明,减少全局作用域污染
- 修正
修复后因为快排的两个递归分支本就操作不重叠的数组区间,即便使用
Promise.all并行执行,逻辑间也不会产生数据干扰,可以正常实现可视化效果。
内容的提问来源于stack exchange,提问作者stackoverflowop
相关产品推荐
相关产品推荐

