我有一个调用异步方法的递归函数,该方法的结果用作调用递归函数的参数。
我正在寻找一种方法来等待所有递归完成 - 但在每个级别都没有任何“中间”等待。也就是说,所有级别的递归应该并行运行,然后才能进行最终的清理操作。
我创建了一个最小的示例,它大致符合我想要实现的目标。
假设我有一个家谱 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()
带有 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()