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

嵌套递归函数中SetTimeout顺序执行及等待子函数完成的实现求助

问题说明

你当前的代码中,StartFunction会递归调用自身,但SubFunction_2内部通过setTimeout实现的递归属于异步操作。直接调用SubFunction_2后立即执行后续的数组操作与递归逻辑,会导致SubFunction_2的异步递归流程还未完成,StartFunction就进入了下一轮,无法保证按顺序执行。

解决办法

核心是把异步的setTimeout递归转换成可等待的Promise流程,同时让主函数能等待子函数的整个递归完成:

  1. 将StartFunction改为async函数,这样内部可以使用await等待异步操作
  2. 把SubFunction_2里的setTimeout包装成Promise,并且在递归调用时等待子递归完成后再resolve当前Promise
  3. 在StartFunction中调用SubFunction_2时加上await,确保等待其整个递归流程结束后再执行后续逻辑

修改后的完整代码

this.myArray = Array(2).fill(undefined);

async StartFunction(len: number) {
  console.info('in StartFunction ', len);
  this.SubFunction_1(len);
  // 等待SubFunction_2的所有递归步骤执行完毕
  await this.SubFunction_2(len);    
  if (len > 0) {
    this.myArray.pop();
    // 递归调用时同样要await,保证每一轮StartFunction都按顺序执行
    await this.StartFunction(this.myArray.length);
  }
}

SubFunction_1(input: number) {
  console.warn('in SubFunction_1 ', input);
}

async SubFunction_2(input: number) {
  console.error('in SubFunction_2 ', input);
  if (input > 0) {
    input--;
    // 把setTimeout包装成Promise,等待异步回调里的递归完成
    await new Promise((resolve) => {
      setTimeout(async () => {
        // 等待下一层的SubFunction_2递归完成,再resolve当前Promise
        await this.SubFunction_2(input);
        resolve('getData completed ' + input);
      }, 1000);
    });
  }
}

执行顺序说明

现在代码会按以下顺序执行:

  • 每一轮StartFunction先执行同步的SubFunction_1
  • 等待SubFunction_2从当前input值开始,每间隔1秒执行一次递归调用,直到input减到0,整个流程完成
  • 之后才会执行数组pop操作,再进入下一轮StartFunction的递归
    完全满足你要求的“等待SubFunction_2执行完成后再推进后续流程”的需求

内容的提问来源于stack exchange,提问作者usersam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:09:58