等待所有嵌套递归函数异步完成

问题描述 投票:0回答:1

我有一个调用异步方法的递归函数,该方法的结果用作调用递归函数的参数。

我正在寻找一种方法来等待所有递归完成 - 但在每个级别都没有任何“中间”等待。也就是说,所有级别的递归应该并行运行,然后才能进行最终的清理操作。

我创建了一个最小的示例,它大致符合我想要实现的目标。

假设我有一个家谱 API - 我获取自己的记录,并返回可能包含“父母”元素的 JSON。如果是这样,我希望它递归并获取所有父记录,继续沿树向上。

这些获取将全部并行触发(交错开始),并需要未知的时间才能全部返回。不过,我想等到所有记录都已获取后再继续“清理”代码。

const recurse = (url) => {
    console.log('Recurse: ', url)
    fetch(url).then((res) => {
      db.write(res.json)
      if ('parents' in res.json) {
        for (let parent in res.json.parents) {
          recurse(parent.URL)
        }
      }
    })
  }
}


const main = () => {
  let data = 'http://api.familytree.example.com/me'
  console.log('Start')
  recurse(data)
  console.log('Cleanup')
}

main()

javascript recursion promise
1个回答
0
投票

带有 Promise 的递归可能很棘手,但是

async
/
await
会让事情变得更容易。这是使用异步函数递归的示例:

const recurse = async (url) => {
  console.log('Recurse: ', url)
  const personData = await fetch(url).then(res => res.json());
  const results = [personData];
  if ('parents' in personData) {
    for (let parent in personData.parents) {
      const ancestors = await recurse(parent.URL);
      results.push(...ancestors);
    }
  }
  
  return results;
};


const main = async () => {
  let data = 
  console.log('Start')
  const data = await recurse('http://api.familytree.example.com/me')
  console.log('Cleanup')
}

main()
© www.soinside.com 2019 - 2024. All rights reserved.