异步QuickSort函数仅完成首次分区后停止工作问题排查
问题原因及解决方案
核心问题
把quickSort_part声明为async后,它的返回值不再是普通的分区索引,而是Promise对象。如果原quickSort函数没有等待这个Promise完成就执行后续逻辑,拿到的会是未resolved的Promise而非实际索引值,导致后续递归无法触发,看起来就像首次分区后停止工作。
具体修复步骤
将
quickSort改为async函数
因为它调用了async的分区函数,必须用await等待分区结果,所以自身也要变成async:async function quickSort(arr, low, high) { if (low < high) { // 用await获取实际分区索引,而非Promise const pi = await quickSort_part(arr, low, high); // 递归调用也要用await保证顺序执行 await quickSort(arr, low, pi - 1); await quickSort(arr, pi + 1, high); } }保证
quickSort_part返回正确值
即使没加延迟,async函数也会把return的值包装成Promise返回,确保它最终返回的是分区索引:async function quickSort_part(arr, low, high) { const pivot = arr[high]; let i = low - 1; for (let j = low; j < high; j++) { if (arr[j] < pivot) { i++; [arr[i], arr[j]] = [arr[j], arr[i]]; } } [arr[i + 1], arr[high]] = [arr[high], arr[i + 1]]; // 返回分区索引,async自动包装为Promise return i + 1; }调用
quickSort时处理Promise
现在quickSort是async函数,调用时需要用await或.then()处理完成状态:// 示例调用 (async function() { const arr = [10, 7, 8, 9, 1, 5]; await quickSort(arr, 0, arr.length - 1); console.log("排序完成:", arr); })();
后续添加延迟的注意事项
要实现动画效果,直接在quickSort_part的关键步骤(比如交换元素后)调用返回Promise的sleep函数即可:
async function quickSort_part(arr, low, high) { const pivot = arr[high]; let i = low - 1; for (let j = low; j < high; j++) { if (arr[j] < pivot) { i++; [arr[i], arr[j]] = [arr[j], arr[i]]; // 交换后加延迟,用于更新UI动画 await sleep(100); } } [arr[i + 1], arr[high]] = [arr[high], arr[i + 1]]; await sleep(100); return i + 1; } // 标准sleep实现 function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
内容的提问来源于stack exchange,提问作者Viraj Doshi
相关产品推荐
相关产品推荐

