JavaScript递归中使用async函数实现带sleep动画的快速排序出错求助
问题原因
async 函数的返回值会自动封装为 Promise 对象,你现有代码中的sort_q、quick_sort都是同步执行逻辑,不会等待partition内部的异步操作(也就是sleep和动画逻辑)执行完成,就直接拿未 resolve 的 Promise 对象当下标使用,同时后续递归排序也会提前执行,此时数组还未完成当前轮次的分区交换,最终导致排序结果错误。
修复步骤
- 给所有调用异步函数的上层递归函数添加
async修饰符,调用partition时添加await关键字等待异步执行完成,拿到正确的分区下标后再执行后续递归 - 给入口函数
quick_sort也添加async修饰符,等待整个排序递归完成后再打印最终结果 - 确保你引入的
sleep函数是符合标准的 Promise 实现(示例:const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)))
修复后完整代码
// 保证sleep是返回Promise的实现 const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)) const MAX_SLEEP_TIME = 2000 let random_numbers = [] // 你的全局随机数数组 const number_of_box = 10 // 假设你的swap_values、swap_boxes_sq函数已经正确实现 function swap_values(a, b) { [random_numbers[a], random_numbers[b]] = [random_numbers[b], random_numbers[a]] } function swap_boxes_sq(a, b) { // 你的动画逻辑 } async function partition(low, high) { var pivot = random_numbers[low]; var i = low+1; var j = high; while (i <= j){ if (random_numbers[i] < pivot){ i++; }else{ swap_values(i, j); swap_boxes_sq(i, j); await sleep(MAX_SLEEP_TIME); j--; } } swap_values(low, i-1); return i-1; } // 加async修饰 async function sort_q(low, high) { if (low < high){ // 等待partition执行完成拿到正确下标 var pi = await partition(low, high); // 递归调用也要await,保证前半部分排序完成再排后半部分 await sort_q(low, pi-1); await sort_q(pi+1, high); } } // 加async修饰 async function quick_sort() { let low = 0; let high = number_of_box -1; // 等待整个排序完成 await sort_q(low, high); console.log(random_numbers); } // 调用入口,也可以用.then处理排序完成后的后续逻辑 // quick_sort()
内容的提问来源于stack exchange,提问作者Gaurav Verma
相关产品推荐
相关产品推荐

