如何实现Jira问题列表获取后批量调用流转记录接口的异步流程?
如何实现Jira问题列表获取后批量调用流转记录接口的异步流程?
看起来你卡在了Jira API异步调用的串联和批量处理上,我来帮你梳理下问题,再给出更清晰的实现方案~
先说说你当前代码里的几个小问题
- 没必要手动封装Promise:
jira.searchJira本身就会返回Promise,不用再套一层new Promise,反而会增加复杂度 - forEach处理异步的坑:在
forEach里发起异步请求时,JavaScript不会等待每个请求完成就会继续执行下一个,你没法确保所有流转记录请求都完成后再做后续处理 - 全局变量存结果不够优雅:用全局的
listWithIssues存储issue列表,容易造成变量污染,也不利于函数间的结果传递 - JSON.stringify/parse冗余:如果
jira.searchJira返回的已经是JSON对象,反复序列化再解析完全没必要,直接用就行
拆分函数的解决方案(用async/await更直观)
我们可以把整个流程拆成三个职责单一的函数,用async/await来处理异步逻辑,让代码更易读也更易维护:
第一步:定义查询语句
const queryAllIssues = "project = Bla AND resolutiondate >= startOfWeek(-1) AND status = Closed AND issuetype = Story ORDER BY resolved DESC";
1. 第一个函数:获取所有符合条件的Issue Key
这个函数只负责调用搜索接口,返回整理好的Issue Key数组
// 获取符合条件的所有Issue Key async function fetchAllIssues() { try { // 直接调用Jira API,await等待结果返回 const searchResponse = await jira.searchJira(queryAllIssues); // 从返回结果里提取每个Issue的key,返回数组 return searchResponse.issues.map(issue => issue.key); } catch (error) { console.error("获取Issue列表失败:", error); throw error; // 抛出错误让上层处理,避免静默失败 } }
2. 第二个函数:批量获取每个Issue的流转记录
接收Issue Key数组,用Promise.all并行处理所有流转记录请求,确保所有请求完成后再返回结果
// 批量获取每个Issue的流转记录 async function fetchAllTransitions(issueKeys) { // 把每个Issue的流转请求包装成Promise,放到数组里 const transitionTasks = issueKeys.map(async (issueKey) => { try { const transitions = await jira.listTransitions(issueKey); // 返回Issue Key和对应的流转记录,方便后续关联 return { issueKey, transitions }; } catch (error) { // 单个Issue请求失败时,记录错误但不中断其他请求 console.error(`获取Issue ${issueKey}的流转记录失败:`, error); return { issueKey, error }; } }); // 等待所有Promise完成,返回所有结果 return Promise.all(transitionTasks); }
3. 第三个函数:处理流转记录结果
接收批量获取的流转记录,做你需要的后续处理(比如统计、打印、存储等)
// 处理获取到的流转记录 function processTransitions(transitionResults) { transitionResults.forEach(result => { // 如果有错误,跳过这个Issue的处理 if (result.error) { console.log(`跳过处理错误的Issue:${result.issueKey}`); return; } // 这里写你的具体处理逻辑,比如打印流转记录 console.log(`Issue ${result.issueKey}的流转记录:`, result.transitions); // 示例:提取流转步骤名称 const transitionNames = result.transitions.map(t => t.name); console.log(`Issue ${result.issueKey}的流转步骤:`, transitionNames); }); }
主入口:串联三个函数
最后写一个主函数,把三个步骤串起来执行
// 主入口函数,执行整个流程 async function runJiraWorkflow() { try { // 第一步:获取Issue列表 const issueKeys = await fetchAllIssues(); console.log(`成功获取到${issueKeys.length}个符合条件的Issue`); // 第二步:批量获取流转记录 const transitionResults = await fetchAllTransitions(issueKeys); // 第三步:处理流转记录 processTransitions(transitionResults); } catch (error) { console.error("整个Jira流程执行失败:", error); } } // 启动流程 runJiraWorkflow();
为什么这样写更好?
- 职责单一:每个函数只做一件事,后续修改或调试时更方便
- 异步逻辑清晰:用
async/await替代Promise链式调用,代码看起来像同步逻辑,更易读 - 并行处理更高效:
Promise.all可以同时发起多个流转记录请求,比逐个等待快很多 - 错误处理完善:每个环节都有错误捕获,单个请求失败不会导致整个流程崩溃
- 无全局变量:结果通过函数返回值传递,避免全局变量带来的问题
备注:内容来源于stack exchange,提问作者Barry Dogger
相关产品推荐
相关产品推荐

