嵌套递归函数中SetTimeout顺序执行及等待子函数完成的实现求助
问题说明
你当前的代码中,StartFunction会递归调用自身,但SubFunction_2内部通过setTimeout实现的递归属于异步操作。直接调用SubFunction_2后立即执行后续的数组操作与递归逻辑,会导致SubFunction_2的异步递归流程还未完成,StartFunction就进入了下一轮,无法保证按顺序执行。
解决办法
核心是把异步的setTimeout递归转换成可等待的Promise流程,同时让主函数能等待子函数的整个递归完成:
- 将
StartFunction改为async函数,这样内部可以使用await等待异步操作 - 把
SubFunction_2里的setTimeout包装成Promise,并且在递归调用时等待子递归完成后再resolve当前Promise - 在
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
相关产品推荐
相关产品推荐

