Promise解析过程中扩展递归结果不符的问题排查与修复
问题分析与修复
你的代码核心问题在于:await p4仅等待原始Promise的首次resolve,不会等待后续通过p4.then()添加的异步回调执行完毕。
为什么会输出2?
p4是已resolve的Promise,await p4会立即获取数组引用。- 第一个
p4.then(rec)的回调被加入微任务队列,主线程会继续执行console.log。 console.log执行时,微任务队列里的rec仅完成第一次执行:把数组的3改成2,后续递归回调(打印2、1并修改数组为1、0)还未执行,因此输出2。console.log执行完毕后,剩余微任务才会依次执行,将数组最终改为0,但此时结果已经打印完成。
修复方案
我们需要维护一个跟踪整个递归回调链的Promise,确保await等待所有递归步骤完成后再读取数组值:
(async () => { var p4 = Promise.resolve([3]); // 用chain变量跟踪所有递归的异步回调链 let chain = p4; var rec = (s) => { let x = s.pop(); s.push(x - 1); if (x > 0) { console.log(x); // 将新的回调添加到chain上,更新chain为最新的Promise chain = chain.then(() => rec(s)); } }; // 初始化回调链 chain = chain.then(rec); // 等待整个递归回调链全部执行完毕 await chain; // 此时数组已经完成所有修改 console.log("result", (await p4)[0]); })();
修复原理
chain变量会持续更新为每次then()返回的新Promise,确保整个递归过程的异步操作被串联起来。await chain会等待所有递归回调执行完成,此时数组已被修改到最终的0,再打印结果就符合预期了。
内容的提问来源于stack exchange,提问作者ceving
相关产品推荐
相关产品推荐

