You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Promise解析过程中扩展递归结果不符的问题排查与修复

问题分析与修复

你的代码核心问题在于:await p4仅等待原始Promise的首次resolve,不会等待后续通过p4.then()添加的异步回调执行完毕。

为什么会输出2?

  1. p4是已resolve的Promise,await p4会立即获取数组引用。
  2. 第一个p4.then(rec)的回调被加入微任务队列,主线程会继续执行console.log。
  3. console.log执行时,微任务队列里的rec仅完成第一次执行:把数组的3改成2,后续递归回调(打印2、1并修改数组为1、0)还未执行,因此输出2。
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:33:27