如何循环获取完整的JSON下游项目序列(同变量不同值)
解决链式项目序列的异步遍历问题
你现在的代码是手动嵌套了两次AJAX调用,只能处理前三个项目,没法自动顺着toto→titi→tata→trtr→tktk→tztz的链条继续遍历对吧?其实用递归函数就能搞定这种异步的链式遍历,让代码自动去获取每个项目的下游,直到走完整个序列。
核心思路
写一个通用的递归函数,逻辑很简单:
- 接收当前要处理的项目名称
- 先打印当前项目(匹配你要的输出顺序)
- 调用AJAX获取该项目的下游列表
- 对每个下游项目,递归调用这个函数,继续处理它的下游
这样就不用手动写多层嵌套的AJAX调用,代码能自动顺着链条走下去。
修改后的完整代码
// 从第一个项目toto启动遍历 fetchDownstream("toto"); // 通用递归遍历函数 function fetchDownstream(projectName) { // 打印当前项目(保证顺序正确) console.log(projectName); // 构造当前项目的API请求URL const url = `.../${projectName}/api/json?pretty=true`; // 发起AJAX请求获取下游项目 ajaxGet(url, function(response) { const jsonData = JSON.parse(response); // 遍历每个下游项目,递归处理 jsonData.downstreamProjects.forEach(function(group) { fetchDownstream(group.name); }); }); } // 保留你原有的AJAX工具函数(不需要ajaxGet2了,通用一个就行) function ajaxGet(url, callback) { // 这里放你原有的AJAX实现逻辑,比如XMLHttpRequest示例: const xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300) { callback(xhr.responseText); } }; xhr.send(); }
代码说明
- 删掉了原来的
ajaxGet2和recover、recover2函数,用一个fetchDownstream递归函数替代,代码更简洁也更灵活。 - 初始调用
fetchDownstream("toto")就会自动启动整个流程:先打印toto,获取它的下游titi,递归处理titi时打印titi并获取tata,以此类推直到tztz。 - 因为AJAX是异步操作,递归能保证我们在上一个项目的下游数据获取完成后,再处理下一个项目,不会打乱输出顺序。
运行这段代码后,就能得到你预期的输出:toto titi tata trtr tktk tztz啦。
内容的提问来源于stack exchange,提问作者Koor Koor28
相关产品推荐
相关产品推荐

