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

React+TS场景下如何等待递归API调用全部完成后处理路径数组

解决方案

你的问题核心是异步递归调用没有做同步阻塞,所有PNP JS的请求都是异步执行的,未等待全部请求完成就执行后续逻辑。可以通过async/await搭配Promise.all改造递归逻辑实现等待效果,具体改造代码如下:

1. 改造componentDidMount方法

public async componentDidMount(){
  const upperArray: string[] = [];
  // 等待所有递归调用完成
  await this.getFiles("/sites/spfxsite/TestLib", upperArray);
  // 此处即可安全处理已填充完成的upperArray,生成树形视图JSON
  console.log("所有路径已全部获取:", upperArray);
}

2. 改造递归调用的getFiles方法

public async getFiles(folderUrl: string, upperArray: string[]): Promise<void> {
  // 等待当前文件夹的API请求返回结果
  const folderRes = await sp.web.getFolderByServerRelativeUrl(folderUrl)
    .expand("Folders, Files")
    .get();

  // 处理当前文件夹下的文件
  folderRes.Files.forEach(item => {
    if (item.ServerRelativeUrl.indexOf("Forms") === -1) {
      upperArray.push(item.ServerRelativeUrl);
    }
  });

  // 收集所有子文件夹的递归调用Promise
  const subFolderTasks: Promise<void>[] = [];
  folderRes.Folders.forEach(item => {
    if (item.ServerRelativeUrl.indexOf("Forms") === -1) {
      upperArray.push(item.ServerRelativeUrl);
      subFolderTasks.push(this.getFiles(item.ServerRelativeUrl, upperArray));
    }
  });

  // 等待当前文件夹下所有子文件夹的递归调用全部执行完成
  await Promise.all(subFolderTasks);
}

实现逻辑说明

  • 每一层getFiles调用都会返回一个Promise,调用方可以通过await等待执行完成
  • 每层请求完成后,会把所有子文件夹的递归调用Promise收集到数组中,通过Promise.all等待全部子任务完成后,当前层的Promise才会结束
  • 最外层的await this.getFiles()执行完成时,所有层级的API请求都已执行结束,upperArray已填充完全,可直接处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:36:07